home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 23 / Amiga Format AFCD23 (Feb 1998, Issue 107).iso / -in_the_mag- / emulation / computers / bkemul / source / bkemul.s next >
Text File  |  1997-12-12  |  57KB  |  3,296 lines

  1. ; © 1997 Russian Digital Computing
  2. ; e-mail: r_d_c@usa.net
  3.  
  4. ;    bchg.b    #1,$bfe001    ; versatile universal debugging tool =)
  5.  
  6.     include    /system
  7.     include    intuition/intuition.i
  8.     include    intuition/intuition_lib.i
  9.     include    exec/exec_lib.i
  10.     include    graphics/graphics_lib.i
  11.     include    exec/memory.i
  12.     include    libraries/dos_lib.i
  13.     include    libraries/dos.i
  14.     include    dos/dosextens.i
  15.     include    dos/dostags.i
  16.  
  17.     section    emu,code
  18.  
  19. p0    equr    a0
  20. p1    equr    a1
  21. p2    equr    a2
  22. p3    equr    a3
  23. p4    equr    d0
  24. p5    equr    d1
  25. p6    equr    d2
  26. p7    equr    d3
  27. ALL_BREAKF    equ    $f000
  28.  
  29. ;
  30. ;------------------------------------------------
  31. ; Beginning init
  32. ;
  33. start    move.l    $4.w,_SysBase
  34.     movem.l    d0/a0,-(sp)        ;save initial values
  35.     clr.l    WB_return_message
  36.     sub.l    a1,a1
  37.     CALLEXEC FindTask
  38.     move.l    d0,a4
  39.     move.l    d0,control_proc_ptr    ;pointer to our process
  40.     tst.l    pr_CLI(a4)        ;CLI structure present?
  41.     bne.s    10$            ;yes
  42.     lea    pr_MsgPort(a4),a0    ;no - we started from WB
  43.     CALLEXEC WaitPort
  44.     lea    pr_MsgPort(a4),a0
  45.     CALLEXEC GetMsg            ;get WB msg
  46.     move.l    d0,WB_return_message
  47. 10$    movem.l    (sp)+,d0/a0
  48.     lea    intname,a1
  49.     moveq    #0,d0
  50.     CALLEXEC OpenLibrary        ;Intuition
  51.     move.l    d0,_IntuitionBase
  52.     beq    err_exit
  53.     lea    grafname,a1
  54.     moveq    #0,d0
  55.     CALLEXEC OpenLibrary        ;Graphics
  56.     move.l    d0,_GfxBase
  57.     beq    err_exit
  58.     lea    dosname,a1
  59.     moveq    #0,d0
  60.     CALLEXEC OpenLibrary        ;DOS
  61.     move.l    d0,_DOSBase
  62.     beq    err_exit
  63.  
  64. ; --------------------------------------
  65. ; CREATE PROCESSOR COMMAND ADDRESS TABLE
  66. ; --------------------------------------
  67. ;
  68. ; Table with 65536 addresses of opcode emulating procedures
  69. ;
  70. generate_decode_table
  71.     lea    ct_vm1,a0
  72.     lea    decode_table,a1
  73. 10$    move.l    (a0)+,d0
  74.     beq.s    30$
  75.     move.w    (a0)+,d1
  76.     subq.l    #1,d1
  77. 20$    move.l    d0,(a1)+
  78.     dbf    d1,20$
  79.     bra.s    10$
  80. 30$
  81.  
  82. ; create opcode timing table (sorry, fake yet)
  83.  
  84. generate_time_table
  85.     lea    time_table,a1
  86.     move.w    #$ffff,d0
  87. 10$    move.w    #1,(a1)+
  88.     dbf    d0,10$
  89.  
  90. ; screen convert table for reverse order of bits in screen
  91. ; for monochrome screen mode and chunky2planar for color mode
  92.  
  93. generate_conv_table
  94.     lea    conv_table,a0
  95.     move.l    #$10000-1,d0
  96.     clr.l    d1
  97. 10$    move.l    d1,d2
  98.     rol.w    #8,d2
  99.     moveq.l    #7,d5
  100.     clr.w    d3
  101.     clr.w    d4
  102. 20$    roxr.w    #1,d2
  103.     roxl.w    #1,d3
  104.     roxr.w    #1,d2
  105.     roxl.w    #1,d4
  106.     dbf    d5,20$
  107.     rol.w    #8,d4
  108.     or.w    d3,d4
  109.     move.w    d4,(a0)+
  110.     addq.l    #1,d1
  111.     dbf    d0,10$
  112.     move.l    #$10000-1,d0
  113.     clr.l    d1
  114. 30$    move.l    d1,d2
  115.     moveq.l    #7,d4
  116. 40$    roxr.w    #1,d2
  117.     roxl.w    #1,d3
  118.     roxr.w    #1,d2
  119.     roxl.w    #1,d3
  120.     dbf    d4,40$
  121.     rol.w    #8,d3
  122.     move.w    d3,(a0)+
  123.     addq.l    #1,d1
  124.     dbf    d0,30$
  125.  
  126. emulation_preparing
  127. ; ROM-file reading
  128.     move.l    #ROM_file_name,d1
  129.     move.l    #MODE_OLDFILE,d2
  130.     CALLDOS    Open
  131.     move.l    d0,ROM_file_handle
  132.     beq    err_exit
  133.     move.l    d0,d1
  134.     move.l    #emul_buffer_begin,d2
  135.     move.l    #$8000,d3
  136.     CALLDOS Read
  137.     cmp.l    #-1,d0
  138.     beq    err_exit
  139. ; allocate signal
  140.     moveq.l    #-1,d0
  141.     CALLEXEC AllocSignal
  142.     tst.b    d0
  143.     bmi    err_exit
  144.     move.b    d0,control_proc_signal_bit
  145.     moveq.l    #1,d1
  146.     lsl.l    d0,d1
  147.     move.l    d1,control_proc_signal
  148. ; emulation process creation
  149.     move.l    #decode_proc_tags,d1
  150.     CALLDOS    CreateNewProc
  151.     move.l    d0,decode_proc_ptr
  152.     beq    err_exit
  153. ; interface and refresh process creation
  154.     move.l    #refresh_proc_tags,d1
  155.     CALLDOS    CreateNewProc
  156.     move.l    d0,refresh_proc_ptr
  157.     beq    err_exit
  158.  
  159. main_loop
  160.     move.l    control_proc_signal,d0
  161.     or.l    #ALL_BREAKF,d0
  162.     CALLEXEC Wait
  163.     and.l    #ALL_BREAKF,d0
  164.     bne    closeall
  165.  
  166. emt36_handler
  167.     move.l    emt36_block_ptr,a5
  168.     move.l    a5,a0
  169.     move.b    #4,1(a0)    ;"STOP" code in response byte
  170.     move.w    2(a0),d0    ;beginning address
  171.     rol.w    #8,d0
  172.     move.w    d0,emt36_adr
  173.     ext.l    d0
  174.     lea    emul_buffer_mid,a1
  175.     add.l    d0,a1        ;physical address in memory
  176.     move.l    a1,emt36_ptr
  177.     move.w    4(a0),d0
  178.     rol.w    #8,d0
  179.     move.w    d0,emt36_len    ;length of file
  180.     add.l    #22,a0        ;end of file name
  181.     move.w    #15,d1        ;name - 16 characters max
  182. 20$    move.b    -(a0),d0    ;find real end of file name
  183.     cmp.b    #32,d0
  184.     dbhi    d1,20$        ;if character code more than space
  185.     tst.w    d1        ;d1=name length minus one
  186.     bmi    emt36_end    ;empty name
  187.     lea    6(a5),a0    ;begin of name
  188.     lea    name_buffer,a1
  189.     lea    koi8_to_1251_table,a2
  190.     clr.l    d2
  191. 30$    move.b    (a0)+,d0    ;copy name to buffer for dos call
  192.     bpl.s    40$
  193.     cmp.b    #@240,d0
  194.     bls.s    50$
  195.     ext.w    d0
  196.     move.b    (a2,d0.w),d0
  197.     bra.s    60$
  198. 40$    cmp.b    #32,d0
  199.     bhi.s    60$
  200.     blo.s    50$
  201.     addq.l    #1,d2
  202.     bra.s    80$
  203. 50$    moveq.b    #"_",d0
  204. 60$    cmp.b    #".",d0
  205.     bne.s    70$
  206.     sub.l    d2,a1
  207. 70$    clr.l    d2
  208. 80$    move.b    d0,(a1)+    ;null terminated string
  209.     dbf    d1,30$
  210.     clr.b    (a1)+
  211.     cmp.b    #2,(a5)
  212.     beq    emt36_write    ;command #2 - write
  213.     cmp.b    #3,(a5)
  214.     bne    emt36_end
  215.  
  216. emt36_read
  217.     move.l    #MODE_OLDFILE,d2
  218.     move.l    #name_full,d1
  219.     CALLDOS    Open
  220.     move.l    d0,emt36_handle
  221.     beq    emt36_end    ;error during file open....
  222.     move.l    d0,d1
  223.     move.l    #fib_buffer,d2
  224.     CALLDOS ExamineFH    ;reading file info block
  225.     tst.l    d0
  226.     beq    100$
  227.     lea    fib_buffer+fib_Comment,a0    ;comment
  228.     clr.b    ROM_load_enable    ;same flag
  229.     clr.l    d0    ;address counter
  230. 20$    clr.l    d1
  231. 30$    move.b    (a0)+,d0    ;extract address from comment
  232.     beq.s    40$
  233.     cmp.b    #"M",d0
  234.     bne.s    33$
  235.     clr.b    bk_color_mode    ;set monochrome mode
  236. 33$    cmp.b    #"C",d0
  237.     bne.s    34$
  238.     move.b    #-1,bk_color_mode    ;set color mode
  239. 34$    cmp.b    #"R",d0
  240.     bne.s    35$
  241.     not.b    ROM_load_enable        ;enable loading in ROM
  242. 35$    cmp.b    #"S",d0
  243.     bne.s    36$
  244.     bset.b    #7,int_flags    ;enable delay
  245. 36$    cmp.b    #"F",d0
  246.     bne.s    37$
  247.     bclr.b    #7,int_flags    ;disable delay
  248. 37$    cmp.b    #"7",d0
  249.     bhi.s    20$
  250.     sub.b    #"0",d0
  251.     bmi.s    20$
  252.     asl.w    #3,d1    ;next digit
  253.     add.w    d0,d1
  254.     bra.s    30$
  255. 40$    tst.w    d1
  256.     bne.s    50$        ;address present and not zero
  257.     lea    fib_buffer+fib_DateStamp+ds_Minute,a0    ;time
  258.     move.l    (a0)+,d1    ;minutes from a.m.
  259.     divul.l    #60,d2:d1    ;d2 - minutes, d1 - hours
  260.     lsl.w    #6,d1        ;shift hours
  261.     add.w    d2,d1        ;add minutes
  262.     lsl.w    #5,d1        ;shift
  263.     move.l    (a0)+,d2    ;number of ticks from last minute
  264.     divu.l    #100,d2        ;number of seconds/2
  265.     add.w    d2,d1        ;get result - time in MS-DOS format
  266.                 ;it is used on FAT disks in BK OSes.
  267.     bne.s    50$
  268.     move.w    #@40000,d1    ;in zero case
  269. 50$    ext.l    d1        ;sign extension
  270.     move.w    d1,d0
  271.     rol.w    #8,d0
  272.     move.w    d0,d4
  273.     move.l    emt36_block_ptr,a5
  274.     move.l    emt36_ptr,d2    ;address for loading
  275.     move.w    2(a5),d5    ;address = zero?
  276.     bne.s    60$        ;no
  277.     add.l    d1,d2        ;yes - add real address to physical
  278.     bra.s    70$
  279. 60$    move.w    d5,d0    ;address not zero - replace default with it
  280. 70$    tst.b    d0
  281.     bpl.s    75$
  282.     tst.b    ROM_load_enable
  283.     beq.s    100$
  284. 75$    move.w    d0,emul_buffer_mid+@264    ;real load address
  285.     move.w    d4,@26(a5)        ;default load address
  286.     move.l    fib_buffer+fib_Size,d3    ;real length
  287.     tst.w    fib_buffer+fib_Size    ;test MSW
  288.     beq.s    80$            ;length less than 65535 bytes
  289.     clr.l    d3
  290.     moveq.w    #-1,d3            ;if file longer
  291. 80$    move.w    d3,d0
  292.     rol.w    #8,d0
  293.     move.w    d0,@30(a5)        ;length no more than 65535
  294.     move.w    d0,emul_buffer_mid+@266    ;--//--
  295.     move.l    d2,d7            ;buffer
  296.     add.l    d3,d7            ;end address of loaded data
  297.     sub.l    #emul_buffer_end,d7    ;load over ROM?
  298.     bmi.s    90$
  299.     sub.l    d7,d3            ;yes - decrease of reading length
  300. 90$    move.l    emt36_handle,d1
  301.     CALLDOS Read
  302.     tst.l    d0
  303.     bmi.s    100$    ;load error
  304.     move.l    emt36_block_ptr,a5
  305.     clr.b    1(a5)            ;operation finished succesfully
  306.     addq.l    #6,a5
  307.     lea    20(a5),a6
  308.     move.l    (a5)+,(a6)+        ;copy name to second part
  309.     move.l    (a5)+,(a6)+        ;of parameter block
  310.     move.l    (a5)+,(a6)+
  311.     move.l    (a5)+,(a6)+
  312. 100$    move.l    emt36_handle,d1
  313.     CALLDOS Close
  314.     bra    emt36_end
  315.  
  316. emt36_write
  317.     move.l    #MODE_NEWFILE,d2
  318.     move.l    #name_full,d1
  319.     CALLDOS    Open
  320.     move.l    d0,emt36_handle
  321.     beq    emt36_end
  322.     move.l    d0,d1
  323.     move.l    emt36_ptr,d2
  324.     clr.l    d3
  325.     move.w    emt36_len,d3
  326.     clr.l    -(sp)
  327.     move.l    d2,d7            ;buffer
  328.     add.l    d3,d7            ;end address of loaded data
  329.     sub.l    #emul_buffer_end,d7    ;load over ROM?
  330.     bmi.s    10$
  331.     move.l    d7,(sp)        ;overload
  332.     sub.l    d7,d3        ;yes - decrease of reading length
  333. 10$    CALLDOS    Write
  334.     move.l    (sp)+,d3
  335.     beq.s    20$
  336.     move.l    #emul_buffer_begin,d2
  337.     move.l    emt36_handle,d1
  338.     CALLDOS    Write
  339. 20$    move.l    emt36_handle,d1
  340.     CALLDOS Close
  341.     lea    comment_buffer,a0
  342.     move.w    emt36_adr,d4
  343. 30$    move.w    d4,d0
  344.     beq.s    40$
  345.     lsr.w    #3,d4
  346.     and.w    #@7,d0
  347.     add.l    #48,d0
  348.     move.b    d0,-(a0)
  349.     bra.s    30$
  350. 40$    move.l    a0,d2
  351.     move.l    #name_full,d1
  352.     CALLDOS    SetComment
  353.     move.l    emt36_block_ptr,a5
  354.     clr.b    1(a5)
  355.  
  356. emt36_end
  357.     move.l    decode_proc_ptr,a1
  358.     move.l    decode_emt36_signal,d0
  359.     CALLEXEC Signal
  360.     bra    main_loop
  361.  
  362.  
  363. err_exit
  364.     move.l    #20,return_code
  365. closeall
  366.  
  367. ;    move.l    #MODE_NEWFILE,d2
  368. ;    move.l    #data_file_name,d1
  369. ;    CALLDOS    Open
  370. ;    move.l    d0,emt36_handle
  371. ;    move.l    d0,d1
  372. ;    move.l    #data_buffer,d2
  373. ;    move.l    #$40000,d3
  374. ;    CALLDOS    Write
  375. ;    move.l    emt36_handle,d1
  376. ;    CALLDOS Close
  377.  
  378.  
  379. fs1    tst.l    control_proc_signal
  380.     beq.s    rt1
  381.     move.b    control_proc_signal_bit,d0
  382.     CALLEXEC FreeSignal
  383. rt1    tst.l    refresh_proc_ptr    ;refresh process created?
  384.     beq.s    rt2            ;no
  385.     tst.b    control_break_flag    ;refresh process terminated?
  386.     bne.s    rt2            ;yes
  387.     addq.b    #1,refresh_break_flag    ;terminate refresh
  388. 10$    move.l    #ALL_BREAKF,d0        ;wait for Break signal
  389.     CALLEXEC Wait            ;(maybe received from anybody)
  390.     tst.b    control_break_flag    ;refresh process terminated?
  391.     beq.s    10$            ;NO??? Wait again...
  392. rt2    clr.b    control_break_flag
  393.     tst.l    decode_proc_ptr
  394.     beq.s    cf1
  395.     bset.b    #6,int_flags
  396. 10$    move.l    #ALL_BREAKF,d0        ;wait for Break signal
  397.     CALLEXEC Wait            ;(maybe received from anybody)
  398.     tst.b    control_break_flag
  399.     beq.s    10$
  400. cf1    move.l    ROM_file_handle,d1
  401.     beq.s    cl1
  402.     CALLDOS    Close
  403. cl1    move.l    _DOSBase,a1
  404.     tst.l    a1
  405.     beq.s    cl2
  406.     CALLEXEC CloseLibrary
  407. cl2    move.l    _GfxBase,a1
  408.     tst.l    a1
  409.     beq.s    cl3
  410.     CALLEXEC CloseLibrary
  411. cl3    move.l    _IntuitionBase,a1
  412.     tst.l    a1
  413.     beq.s    ca1
  414.     CALLEXEC CloseLibrary
  415. ca1    tst.l    WB_return_message
  416.     beq.s    10$
  417.     CALLEXEC Forbid
  418.     move.l    WB_return_message,a1
  419.     CALLEXEC ReplyMsg
  420. 10$    move.l    return_code,d0
  421.     rts
  422.  
  423. ;----------------------------------------
  424. ;  SCREEN REFRESH AND CONTROL INTERFACE
  425. ;----------------------------------------
  426. ;
  427. change_screen_mode            ;prepare data for open screen
  428.     lea    delta_buffer,a0
  429.     move.w    #1023,d0
  430. 10$    clr.l    (a0)+
  431.     clr.l    (a0)+
  432.     clr.l    (a0)+
  433.     clr.l    (a0)+
  434.     dbf    d0,10$
  435.     move.l    sbs_ptr,a0
  436.     clr.l    d0
  437.     move.w    sc_LeftEdge(a0),d0    ;new screen opened over old screen
  438.     move.w    sc_TopEdge(a0),a1    ;then old screen closed
  439.     move.l    a0,old_sbs_ptr        ;
  440.     clr.l    sbs_ptr            ;
  441.     move.l    wbs_ptr,old_wbs_ptr    ;
  442.     clr.l    wbs_ptr
  443.     move.l    cbs_ptr,old_cbs_ptr
  444.     clr.l    cbs_ptr
  445.     not.b    bk_color_mode_flag
  446.     move.b    bk_color_mode_flag,bk_color_mode
  447.     bne.s    20$
  448.     asl.w    #1,d0            ;this is for open new screen
  449.     move.l    d0,mono_x+4        ;at same physical screen place
  450.     move.l    a1,mono_y+4        ;where was old screen
  451.     bra    refresh_proc
  452. 20$    asr.w    #1,d0
  453.     move.l    d0,color_x+4
  454.     move.l    a1,color_y+4
  455.  
  456. refresh_proc
  457.     bsr    screen_open        ;open new screen
  458.     beq    refresh_end        ;not opened - error
  459.     bsr    get_bitplane_pointers
  460.     clr.l    (a1)            ;remove point in upper left corner
  461. 10$    move.b    #1,refresh_counter    ;number of vblanks to refresh
  462.     bsr    refresh            ;do refresh
  463.     bsr    old_screen_close    ;close old screen if opened
  464. 20$    move.b    bk_color_mode_flag,d0
  465.     cmp.b    bk_color_mode,d0    ;was color mode changed?
  466.     bne    change_screen_mode    ;yes
  467.     bsr    setjoy            ;set joystick bits
  468.     bsr    get_event        ;got any event?
  469.     beq.s    30$            ;no
  470.     btst    #9,d0            ;screen close button pressed?
  471.     bne    refresh_end        ;end of process
  472.     btst    #10,d0            ;scancode?
  473.     beq    205$            ;no
  474.     cmp.b    #$5f,d1            ;HELP?
  475.     bne.s    201$            ;no
  476.     tst.b    d2            ;rcommand pressed?
  477.     bpl    change_screen_mode    ;no
  478.     bchg.b    #7,int_flags        ;delay on/off
  479. 201$    lea    keytab1,a0
  480.     bsr    key_compare
  481.     beq.s    30$
  482.     cmp.b    #14,d1            ;RUS?
  483.     beq.s    203$            ;yes
  484.     cmp.b    #15,d1            ;LAT?
  485.     bne.s    25$            ;no
  486.     clr.b    rus_flag
  487.     bra.s    25$
  488. 203$    move.b    d1,rus_flag
  489.     bra.s    25$
  490. 205$    cmp.b    #27,d1            ;ESC?
  491.     bne.s    215$
  492.     tst.b    d2
  493.     bmi.s    207$
  494.     bset.b    #1,int_flags        ;STOP
  495.     bra.s    30$
  496. 207$    bset.b    #0,int_flags        ;RESET
  497.     bra.s    30$
  498. 215$    lea    keytab2,a0
  499.     bsr.s    key_compare
  500. 25$    bsr    send_code
  501. 30$    tst.b    refresh_break_flag    ;Break received?
  502.     bne    refresh_end        ;yes
  503.     move.l    decode_proc_ptr,a1
  504.     move.l    decode_delay_signal,d0
  505.     CALLEXEC Signal            ;start of sleeping emul proc
  506.     btst    #0,$bfec01
  507.     bne.s    40$
  508.     bset    #6,p177716+1
  509. 40$    CALLGRAF WaitTOF        ;wait for vblank
  510.     subq.b    #1,refresh_counter    ;decrease refresh wait counter
  511.     bne    20$            ;wait for next event
  512.     bra    10$            ;counter=zero -> refresh!
  513.  
  514. key_compare
  515. 10$    move.b    (a0)+,d7
  516.     beq.s    20$
  517.     move.b    (a0)+,d6
  518.     cmp.b    d1,d7
  519.     bne.s    10$
  520.     move.b    d6,d1
  521. 20$    rts
  522.  
  523. refresh_end
  524.     bsr    all_screens_close    ;close all opened screens
  525.     addq.b    #1,control_break_flag    ;terminate main process
  526.     move.l    control_proc_ptr,a1
  527.     move.l    #ALL_BREAKF,d0
  528.     CALLEXEC Signal            ;send Break to it
  529.     rts
  530.  
  531. get_event
  532.     move.l    cbs_ptr,a0        ;window with
  533.     move.l    wd_UserPort(a0),a0    ;screen close button
  534.     CALLEXEC GetMsg
  535.     tst.l    d0
  536.     bne.s    10$            ;event received
  537.     move.l    wbs_ptr,a0        ;main backdrop window
  538.     move.l    wd_UserPort(a0),a0
  539.     CALLEXEC GetMsg
  540.     tst.l    d0
  541.     beq.s    20$            ;no new events
  542. 10$    move.l    d0,a1
  543.     move.l    im_Class(a1),-(sp)    ;what event
  544.     move.w    im_Code(a1),-(sp)
  545.     move.w    im_Qualifier(a1),-(sp)
  546.     CALLEXEC ReplyMsg        ;recycle msg
  547.     clr.l    d1
  548.     clr.l    d2
  549.     move.w    (sp)+,d2
  550.     move.w    (sp)+,d1
  551.     move.l    (sp)+,d0
  552. 20$    rts
  553.  
  554. send_code
  555.     btst    #6,p177716+1
  556.     beq.s    30$
  557.     btst    #7,p177660+1
  558.     bne.s    30$
  559.     bset    #7,p177660+1
  560.     bclr    #6,p177716+1
  561.     btst    #6,p177660+1
  562.     bne.s    20$
  563.     tst.b    d1
  564.     bmi.s    12$
  565.     tst.b    d2
  566.     bpl.s    14$
  567. 12$    bset.b    #2,int_flags+1
  568.     bra.s    20$
  569. 14$    bset.b    #1,int_flags+1
  570. 20$    and.w    #@177,d1
  571.     btst    #6,d1
  572.     beq.s    25$
  573.     tst.b    rus_flag
  574.     bne.s    25$
  575.     bchg    #5,d1
  576. 25$    move.w    d1,p177662
  577. 30$    rts
  578.  
  579. screen_open
  580.     sub.l    a0,a0
  581.     lea    colortag,a1
  582.     move.w    #256,wwidth
  583.     tst.b    bk_color_mode_flag
  584.     bne.s    10$
  585.     lea    monotag,a1
  586.     move.w    #512,wwidth
  587. 10$    CALLINT    OpenScreenTagList    ;open screen
  588.     move.l    d0,sbs_ptr
  589.     beq    20$
  590.     move.l    d0,sbs_cop
  591.     lea    c_bk_screen,a0
  592.     CALLINT    OpenWindow        ;open main backdrop window
  593.     move.l    d0,cbs_ptr
  594.     beq    20$
  595.     lea    w_bk_screen,a0
  596.     CALLINT    OpenWindow        ;open window with screen
  597.     move.l    d0,wbs_ptr        ;close button
  598. 20$    rts
  599.  
  600. all_screens_close        ;close all opened screens
  601.     move.l    wbs_ptr,a0
  602.     clr.l    wbs_ptr
  603.     move.l    cbs_ptr,a1
  604.     clr.l    cbs_ptr
  605.     move.l    sbs_ptr,a2
  606.     clr.l    sbs_ptr
  607.     bsr.s    screens_close
  608. old_screen_close
  609.     move.l    old_wbs_ptr,a0
  610.     clr.l    old_wbs_ptr
  611.     move.l    old_cbs_ptr,a1
  612.     clr.l    old_cbs_ptr
  613.     move.l    old_sbs_ptr,a2
  614.     clr.l    old_sbs_ptr
  615. screens_close
  616.     tst.l    a0
  617.     beq.s    10$
  618.     move.l    a1,-(sp)
  619.     move.l    a2,-(sp)
  620.     CALLINT    CloseWindow
  621.     move.l    (sp)+,a2
  622.     move.l    (sp)+,a1
  623. 10$    move.l    a1,a0
  624.     tst.l    a0
  625.     beq.s    20$
  626.     move.l    a2,-(sp)
  627.     CALLINT    CloseWindow
  628.     move.l    (sp)+,a2
  629. 20$    move.l    a2,a0
  630.     tst.l    a0
  631.     beq.s    30$
  632.     CALLINT    CloseScreen
  633. 30$    rts
  634.  
  635. refresh
  636.     lea    emul_buffer_mid+@40000,a0    ;begin screen address
  637.     lea    @40000(a0),a4            ;end screen address
  638.     lea    delta_buffer,a5            ;delta-buffer
  639.     bsr    get_bitplane_pointers
  640.     lea    conv_table,a3        ;color conversion table
  641.     tst.b    bk_color_mode_flag    ;color or monochrome
  642.     bne.s    20$            ;if monochrome - then get
  643.     add.l    #$20000,a3        ;second half of table
  644. 20$    clr.l    d1
  645.     clr.l    d3
  646.     move.w    #256,d4
  647.     clr.l    d5
  648.     move.w    p177664,d3
  649.     move.w    d3,d6
  650.     and.w    #@1000,d6
  651.     bne.s    30$
  652.     asr.w    #2,d4
  653.     cmp.w    c177664,d6
  654.     beq.s    30$
  655.     move.w    #1535,d5
  656. 30$    move.w    d6,c177664
  657.     sub.w    #@330,d3    ;calculate real address
  658.     and.w    #$ff,d3        ;beginning of screen
  659.     asl.w    #6,d3
  660.     add.l    d3,a0
  661.     subq.w    #1,d4
  662.     clr.l    d3        ;refresh cycles counter
  663.     tst.b    bk_color_mode_flag
  664.     beq    mono_refresh
  665.  
  666.  
  667. color_refresh
  668.  
  669. CSC    MACRO
  670. 10\1$    cmp.l    (a0)+,(a5)+
  671.     beq.s    11\1$
  672.     move.l    (a0),(a5)
  673.     bra.s    12\1$
  674. 11\1$    cmp.l    (a0)+,(a5)+
  675.     beq.s    10\2$
  676.     move.l    -(a0),-(a5)
  677. 12\1$    move.l    -(a0),-(a5)
  678.     bsr    color_converter
  679.     move.l    d6,\3(a1)
  680.     move.l    d7,\3(a2)
  681.     ENDM
  682.  
  683. 10$    CSC    0,1,$00
  684.     CSC    1,2,$04
  685.     CSC    2,3,$08
  686.     CSC    3,4,$0C
  687.     CSC    4,5,$10
  688.     CSC    5,6,$14
  689.     CSC    6,7,$18
  690.     CSC    7,8,$1C
  691. 108$    add.w    #32,a1
  692.     add.w    #32,a2
  693.     cmp.l    a0,a4
  694.     bne.s    20$
  695.     sub.l    #$4000,a0
  696. 20$    dbf    d4,10$
  697.  
  698.     bsr    test_delay
  699.     tst.w    d5
  700.     beq.s    80$
  701.     add.w    #$3000,a5
  702.     add.w    #$1800,a1
  703.     add.w    #$1800,a2
  704. 30$    tst.l    -(a5)
  705.     bne.s    50$
  706.     tst.l    -(a5)
  707.     beq.s    40$
  708.     clr.l    (a5)
  709.     bra.s    60$
  710. 40$    subq.l    #4,a1
  711.     subq.l    #4,a2
  712.     bra.s    70$
  713. 50$    clr.l    (a5)
  714.     clr.l    -(a5)
  715. 60$    clr.l    -(a1)
  716.     clr.l    -(a2)
  717. 70$    dbf    d5,30$
  718. 80$    rts
  719.  
  720.  
  721. mono_refresh
  722.  
  723. CSM    MACRO
  724. 10\1$    cmp.l    (a0)+,(a5)+
  725.     beq.s    11\1$
  726.     move.l    (a0),(a5)
  727.     bra.s    12\1$
  728. 11\1$    cmp.l    (a0)+,(a5)+
  729.     beq.s    10\2$
  730.     move.l    -(a0),-(a5)
  731. 12\1$    move.l    -(a0),-(a5)
  732.     bsr    mono_converter
  733.     move.l    d2,\3(a1)
  734.     move.l    d6,\3+4(a1)
  735.     ENDM
  736.  
  737. 10$    CSM    0,1,$00
  738.     CSM    1,2,$08
  739.     CSM    2,3,$10
  740.     CSM    3,4,$18
  741.     CSM    4,5,$20
  742.     CSM    5,6,$28
  743.     CSM    6,7,$30
  744.     CSM    7,8,$38
  745. 108$    add.w    #64,a1
  746.     cmp.l    a0,a4
  747.     bne.s    20$
  748.     sub.l    #$4000,a0
  749. 20$    dbf    d4,10$
  750.     bsr    test_delay
  751.     tst.w    d5
  752.     beq.s    80$
  753.     add.w    #$3000,a5
  754.     add.w    #$3000,a1
  755. 30$    tst.l    -(a5)
  756.     bne.s    40$
  757.     subq.l    #4,a1
  758.     bra.s    50$
  759. 40$    clr.l    (a5)
  760.     clr.l    -(a1)
  761. 50$    tst.l    -(a5)
  762.     bne.s    60$
  763.     subq.l    #4,a1
  764.     bra.s    70$
  765. 60$    clr.l    (a5)
  766.     clr.l    -(a1)
  767. 70$    dbf    d5,30$
  768. 80$    rts
  769.  
  770. test_delay
  771.     btst.b    #7,int_flags        ;delay on?
  772.     bne    10$            ;yes
  773.     cmp.l    #1024,d3        ;half screen or more was refreshed?
  774.     blo    10$
  775.     addq.b    #1,refresh_counter    ;more - delay next refresh
  776. 10$    rts
  777.  
  778. get_bitplane_pointers
  779.     move.l    sbs_ptr,a1
  780.     move.l    sc_RastPort+rp_BitMap(a1),a1    ;screen bitmap
  781.     move.l    bm_Planes+4(a1),a2        ;second bitplane
  782.     move.l    bm_Planes(a1),a1        ;first bitplane
  783.     rts
  784.  
  785. color_converter
  786.     addq.l    #1,d3
  787.     addq.l    #8,a5
  788.     move.w    (a0)+,d1
  789.     move.w    0(a3,d1.l*2),d2
  790.     move.b    d2,d6
  791.     move.w    d2,d7
  792.     rol.w    #8,d6
  793.     move.w    (a0)+,d1
  794.     move.w    0(a3,d1.l*2),d2
  795.     move.b    d2,d6
  796.     rol.w    #8,d2
  797.     move.b    d2,d7
  798.     swap    d6
  799.     swap    d7
  800.     move.w    (a0)+,d1
  801.     move.w    0(a3,d1.l*2),d2
  802.     move.b    d2,d6
  803.     move.w    d2,d7
  804.     rol.w    #8,d6
  805.     move.w    (a0)+,d1
  806.     move.w    0(a3,d1.l*2),d2
  807.     move.b    d2,d6
  808.     rol.w    #8,d2
  809.     move.b    d2,d7
  810.     rts
  811.  
  812. mono_converter
  813.     addq.l    #1,d3
  814.     addq.l    #8,a5
  815.     move.w    (a0)+,d1
  816.     move.w    0(a3,d1.l*2),d2
  817.     swap    d2
  818.     move.w    (a0)+,d1
  819.     move.w    0(a3,d1.l*2),d2
  820.     move.w    (a0)+,d1
  821.     move.w    0(a3,d1.l*2),d6
  822.     swap    d6
  823.     move.w    (a0)+,d1
  824.     move.w    0(a3,d1.l*2),d6
  825.     rts
  826.  
  827. ;------------------------------
  828. ;------------------------------
  829. ; PROCESSOR EMULATION ROUTINES
  830. ;------------------------------
  831. ;------------------------------
  832.  
  833. ; ------------------
  834. ; MACRO COMMANDS SET
  835. ; ------------------
  836. ;
  837. BK_RB    MACRO        ;reading byte (\1) to \2
  838.     cmp.w    #@177600,\1    ;check ports address space
  839.     blo.s    *+6        ;no
  840.     bsr    rbp_\1\2    ;port reading
  841.     move.b    (a4,\1.w),\2    ;done
  842.     ENDM
  843. BK_RW    MACRO        ;reading word (\1) to \2
  844.     bclr.l    #0,\1    ;align to even
  845.     cmp.w    #@177600,\1    ;check ports address space
  846.     blo.s    *+6        ;no
  847.     bsr    rwp_\1\2    ;port reading
  848.     move.w    (a4,\1.w),\2    ;done
  849.     rol.w    #8,\2        ;swap bytes
  850.     ENDM
  851. BK_SB    MACRO        ;write byte \1 to (\2)
  852.     tst.w    \2        ;check ports & ROM address space
  853.     bpl.s    *+6        ;no
  854.     bsr    wbp_\1\2    ;write to port or bus error
  855.     move.b    \1,(a4,\2.w)    ;done
  856.     ENDM
  857. BK_NSW    MACRO        ;write word \1 to (\2)
  858.     tst.w    \2        ;check ports & ROM address space
  859.     bpl.s    *+6        ;no
  860.     bsr    wwp_\1\2    ;write to port or bus error
  861.     rol.w    #8,\1        ;swap bytes
  862.     move.w    \1,(a4,\2.w)    ;done
  863.     ENDM
  864. BK_SW    MACRO        ;BK_NSW plus address align
  865.     bclr.l    #0,\2
  866.     BK_NSW    \1,\2
  867.     ENDM
  868. BK_RRW    MACRO        ;BK_RW without \1 trashing
  869.     move.w    \1,\2
  870.     BK_RW    \2,\2
  871.     ENDM
  872.  
  873. CALL    MACRO        ;JSR without stack operations
  874.     lea    *+6(pc),\2
  875.     jmp    (\1)
  876.     ENDM
  877. RET    MACRO        ;RTS without stack operations
  878.     jmp    (\1)
  879.     ENDM
  880. RETCMD    MACRO
  881.     bra    dc_next
  882.     ENDM
  883.  
  884. rbp    MACRO
  885. rbp_\1\2
  886.     movem.l    d0-a6,-(sp)
  887.     move.l    \1,a6
  888.     bsr    rbp_
  889.     move.w    d6,rmem
  890.     movem.l    (sp)+,d0-a6
  891.     move.w    rmem,\2
  892.     addq.l    #4,(sp)
  893.     rts
  894.     ENDM
  895. rwp    MACRO
  896. rwp_\1\2
  897.     movem.l    d0-a6,-(sp)
  898.     move.l    \1,a6
  899.     bsr    rwp_
  900.     move.w    d6,rmem
  901.     movem.l    (sp)+,d0-a6
  902.     move.w    rmem,\2
  903.     addq.l    #6,(sp)
  904.     rts
  905.     ENDM
  906. wbp    MACRO
  907. wbp_\1\2
  908.     movem.l    d0-a6,-(sp)
  909.     move.l    \2,a6
  910.     move.l    \1,d6
  911.     bsr    wbp_
  912.     movem.l    (sp)+,d0-a6
  913.     addq.l    #4,(sp)        ;skip write operation
  914.     rts
  915.     ENDM
  916. wwp    MACRO
  917. wwp_\1\2
  918.     movem.l    d0-a6,-(sp)
  919.     move.l    \2,a6
  920.     move.l    \1,d6
  921.     bsr    wwp_
  922.     movem.l    (sp)+,d0-a6
  923.     addq.l    #6,(sp)        ;skip ROL.W #8 and write operation
  924.     rts
  925.     ENDM
  926.  
  927. dCMD    MACRO
  928.     dc.l    \1
  929.     dc.w    \2
  930.     ENDM
  931.  
  932. CMD_Rx    MACRO
  933.     dCMD    \1r0,1
  934.     dCMD    \1r1,1
  935.     dCMD    \1r2,1
  936.     dCMD    \1r3,1
  937.     dCMD    \1r4,1
  938.     dCMD    \1r5,1
  939.     dCMD    \1r6,1
  940.     dCMD    \1r7,1
  941.     dCMD    \1__,56
  942.     ENDM
  943. CMD_Rm    MACRO
  944.     dCMD    \1r0,1
  945.     dCMD    \1r1,1
  946.     dCMD    \1r2,1
  947.     dCMD    \1r3,1
  948.     dCMD    \1r4,1
  949.     dCMD    \1r5,1
  950.     dCMD    \1r6,1
  951.     dCMD    \1r7,1
  952.     ENDM
  953. CMD_Rn    MACRO
  954.     dCMD    \1r0,64
  955.     dCMD    \1r1,64
  956.     dCMD    \1r2,64
  957.     dCMD    \1r3,64
  958.     dCMD    \1r4,64
  959.     dCMD    \1r5,64
  960.     dCMD    \1r6,64
  961.     dCMD    \1r7,64
  962.     ENDM
  963. FCMD_Rn    MACRO
  964. _\1r0    \1rn    p0
  965. _\1r1    \1rn    p1
  966. _\1r2    \1rn    p2
  967. _\1r3    \1rn    p3
  968. _\1r4    \1rn    p4
  969. _\1r5    \1rn    p5
  970. _\1r6    \1rn    p6
  971. _\1r7    \1rn    p7
  972.     ENDM
  973.  
  974. ; -----------------
  975. ;  PORTS EMULATION
  976. ; -----------------
  977.  
  978. rmem    dc.w    0
  979.  
  980. rbp_    move.l    sp,a5
  981.     move.w    a6,d0    ;reading byte from port
  982.     btst.l    #0,d0    ;check LSbit of address
  983.     beq.s    rwp_    ;even address
  984.     bsr.s    rwp_    ;odd address
  985.     rol.w    #8,d6    ;swap bytes
  986.     rts
  987. rwp_    move.l    sp,a5
  988.     move.w    a6,d0
  989.     asr.w    #1,d0
  990.     lea    prt_vm1,a0
  991.     move.l    (a0,d0.w*4),a0
  992.     tst.l    a0
  993.     beq.s    halt
  994.     jmp    (a0)
  995.  
  996. wbp_    move.l    sp,a5
  997.     move.w    a6,d0
  998.     and.w    #$ff,d6        ;clear MSbyte
  999.     btst.l    #0,d0        ;check if address even
  1000.     beq.s    wwp_        ;even
  1001.     rol.w    #8,d6        ;odd - write byte as MS
  1002. wwp_    move.l    sp,a5
  1003.     move.w    a6,d0
  1004.     cmp.w    #@177600,d0    ;write to ports?
  1005.     blo.s    halt        ;write to ROM!
  1006.     asr.w    #1,d0        ;convert byte address to word address
  1007.     lea    pwt_vm1,a0    ;hardware emulating routines table
  1008.     move.l    (a0,d0.w*4),a0    ;select address
  1009.     tst.l    a0
  1010.     beq.s    halt        ;no device response - bus error
  1011.     jmp    (a0)        ;emulating device
  1012.  
  1013. halt    move.l    a5,sp
  1014.     addq.l    #4,sp
  1015.     movem.l    (sp)+,d0-a6    ;restore registers
  1016.     move.l    decode_init_stack,sp    ;restore stack
  1017.     btst.b    #0,int_flags    ;check reset flag
  1018.     bne.l    reset
  1019.     moveq.l    #4,d6    ;bus error exception
  1020.     bsr.l    int
  1021.     RETCMD
  1022.  
  1023. reset_hw
  1024.     clr.b    rus_flag
  1025.     move.w    #@100,p177660
  1026.     rts
  1027.  
  1028. wp177660
  1029.     move.w    p177660,d1
  1030.     bclr.l    #6,d1
  1031.     and.w    #@100,d6
  1032.     or.w    d6,d1
  1033.     move.w    d1,p177660
  1034.     rts
  1035. rp177660
  1036.     move.w    p177660,d6
  1037.     rts
  1038.  
  1039. rp177662
  1040.     move.w    p177662,d6
  1041.     move.w    p177660,d1
  1042.     bclr.l    #7,d1
  1043.     move.w    d1,p177660
  1044.     rts
  1045.  
  1046. wp177664
  1047.     and.w    #%1011111111,d6
  1048.     move.w    d6,p177664
  1049.     rts
  1050. rp177664
  1051.     move.w    p177664,d6
  1052.     rts
  1053.  
  1054. wp177716
  1055.     rts
  1056. rp177716
  1057.     move.w    p177716,d6
  1058.     rts
  1059.  
  1060. wp177714
  1061.     rts
  1062. rp177714
  1063.     move.w    p177714,d6
  1064.     rts
  1065.  
  1066. setjoy    clr.l    d6    ;joystick emulation
  1067.     move.w    $dff00c,d0
  1068.     btst.l    #9,d0
  1069.     beq.s    10$
  1070.     bset.l    #1,d6    ;left
  1071.     btst.l    #8,d0
  1072.     bne.s    30$
  1073.     bra.s    20$
  1074. 10$    btst.l    #8,d0
  1075.     beq.s    30$
  1076. 20$    bset.l    #2,d6    ;forward
  1077. 30$    btst.l    #1,d0
  1078.     beq.s    40$
  1079.     bset.l    #0,d6    ;right
  1080.     btst.l    #0,d0
  1081.     bne.s    60$
  1082.     bra.s    50$
  1083. 40$    btst.l    #0,d0
  1084.     beq.s    60$
  1085. 50$    bset.l    #3,d6    ;back
  1086. 60$    tst.b    $bfe001
  1087.     bmi.s    70$
  1088.     bset.l    #5,d6    ;fire0
  1089. 70$    btst.b    #6,$dff016
  1090.     bne.s    80$
  1091.     bset.l    #4,d6    ;fire1
  1092. 80$    move.w    d6,p177714
  1093.     rts
  1094.  
  1095.  
  1096. rp177700
  1097.     rts
  1098. rp177702
  1099.     rts
  1100. rp177704
  1101.     rts
  1102. rp177706
  1103.     rts
  1104. rp177710
  1105.     rts
  1106. rp177712
  1107.     rts
  1108.  
  1109. wp177700
  1110.     rts
  1111. wp177702
  1112.     rts
  1113. wp177704
  1114.     rts
  1115. wp177706
  1116.     rts
  1117. wp177710
  1118.     rts
  1119. wp177712
  1120.     rts
  1121.  
  1122. _emt_36
  1123.     movem.l    d0-a6,-(sp)
  1124.     add.w    p1,a4
  1125.     move.l    a4,emt36_block_ptr
  1126.     move.l    control_proc_signal,d0
  1127.     move.l    control_proc_ptr,a1
  1128.     CALLEXEC Signal
  1129.     move.l    decode_emt36_signal,d0
  1130.     CALLEXEC Wait
  1131.     movem.l    (sp)+,d0-a6
  1132.     RETCMD
  1133.  
  1134.     wbp    d4,p0
  1135.     wbp    d4,p1
  1136.     wbp    d4,p2
  1137.     wbp    d4,p3
  1138.     wbp    d4,p4
  1139.     wbp    d4,p5
  1140.     wbp    d4,p6
  1141.     wbp    d4,p7
  1142.     wbp    d6,p0
  1143.     wbp    d6,p1
  1144.     wbp    d6,p2
  1145.     wbp    d6,p3
  1146.     wbp    d6,p4
  1147.     wbp    d6,p5
  1148.     wbp    d6,p6
  1149.     wbp    d6,p7
  1150.     wbp    d4,d6
  1151.     wbp    d6,d7
  1152.     wbp    d5,d4
  1153.  
  1154.     rbp    p0,d4
  1155.     rbp    p1,d4
  1156.     rbp    p2,d4
  1157.     rbp    p3,d4
  1158.     rbp    p4,d4
  1159.     rbp    p5,d4
  1160.     rbp    p6,d4
  1161.     rbp    p7,d4
  1162.     rbp    p0,d6
  1163.     rbp    p1,d6
  1164.     rbp    p2,d6
  1165.     rbp    p3,d6
  1166.     rbp    p4,d6
  1167.     rbp    p5,d6
  1168.     rbp    p6,d6
  1169.     rbp    p7,d6
  1170.     rbp    d4,d4
  1171.     rbp    d7,d6
  1172.     rbp    d6,d5
  1173.     rbp    d4,d5
  1174.  
  1175.     rwp    d4,d4
  1176.     rwp    d6,d6
  1177.     rwp    d6,d3
  1178.     rwp    d4,d3
  1179.     rwp    d7,d7
  1180.     rwp    d7,d6
  1181.     rwp    d4,d6
  1182.     rwp    d1,d1
  1183.  
  1184.     wwp    d3,d4
  1185.     wwp    d4,d7
  1186.     wwp    d4,d6
  1187.     wwp    d6,d7
  1188.  
  1189. ; ----------------------------
  1190. ;  OPCODES EMULATING ROUTINES
  1191. ; ----------------------------
  1192. ;
  1193. ; Software exceptions
  1194. ;
  1195. _halt__    moveq.l    #4,d6
  1196.     bra.s    intc
  1197. _rsrv__    moveq.l    #@10,d6
  1198.     bra.s    intc
  1199. _bpt___    moveq.l    #@14,d6
  1200.     bra.s    intc
  1201. _iot___    moveq.l    #@20,d6
  1202.     bra.s    intc
  1203. _emt___    moveq.l    #@30,d6
  1204.     bra.s    intc
  1205. _trap__    moveq.l    #@34,d6
  1206. intc    bsr.s    int
  1207.     RETCMD
  1208. ;
  1209. ;----------------------------
  1210. ; EXCEPTION HANDLING
  1211. ; d6 - vector
  1212. ;
  1213. int    move.w    d2,d4
  1214.     subq.w    #2,d4
  1215.     bclr.l    #0,d4
  1216.     BK_SB    d5,d4
  1217.     subq.w    #2,d4
  1218.     BK_NSW    d3,d4
  1219.     BK_RW    d6,d3
  1220.     addq.w    #2,d6
  1221.     BK_RB    d6,d5
  1222.     bclr.b    #2,int_flags
  1223.     btst.l    #4,d5
  1224.     beq.s    10$
  1225.     bset.b    #2,int_flags
  1226. 10$    subq.w    #4,d2
  1227.     rts
  1228.  
  1229. _reset_    bsr    reset_hw
  1230.     RETCMD
  1231.  
  1232. _wait__
  1233. ;    movem.l    d0-a6,-(sp)
  1234. ;    addq.b    #1,wait_flag
  1235. ;    move.l    decode_emt36_signal,d0
  1236. ;    CALLEXEC Wait
  1237. ;    movem.l    (sp)+,d0-a6
  1238.     RETCMD
  1239.  
  1240. ;----------------------------
  1241. ; Return from exception
  1242. ;
  1243. _rti___
  1244.     move.w    d2,d4
  1245.     BK_RW    d4,d3
  1246.     addq.w    #2,d4
  1247.     BK_RB    d4,d5
  1248.     bclr.b    #2,int_flags
  1249.     btst.l    #4,d5
  1250.     beq.s    10$
  1251.     bset.b    #2,int_flags
  1252. 10$    addq.w    #4,d2
  1253.     RETCMD
  1254. _rtt___
  1255.     move.w    d2,d4
  1256.     BK_RW    d4,d3
  1257.     addq.w    #2,d4
  1258.     BK_RB    d4,d5
  1259.     bclr.b    #2,int_flags
  1260.     btst.l    #4,d5
  1261.     beq.s    10$
  1262.     bset.b    #2,int_flags
  1263. 10$    addq.w    #4,d2
  1264.     clr.l    d4
  1265.     bra.l    dc_rtt
  1266.  
  1267. ; Condition flags changing
  1268.  
  1269. _se____    and.w    #$F,d4
  1270.     or.w    d4,d5
  1271.     RETCMD
  1272. _cl____    and.w    #$F,d4
  1273.     not.w    d4
  1274.     and.w    d4,d5
  1275.     RETCMD
  1276.  
  1277. ;------------------------------------------------
  1278. ; conditional and unconditional branches
  1279. ; fully same as Motorola's
  1280. ;
  1281. _bne___    move.b    d5,ccr
  1282.     bne.s    _br____
  1283.     RETCMD
  1284. _beq___    move.b    d5,ccr
  1285.     beq.s    _br____
  1286.     RETCMD
  1287. _bvc___    move.b    d5,ccr
  1288.     bvc.s    _br____
  1289.     RETCMD
  1290. _bvs___    move.b    d5,ccr
  1291.     bvs.s    _br____
  1292.     RETCMD
  1293. _bcc___    move.b    d5,ccr
  1294.     bcc.s    _br____
  1295.     RETCMD
  1296. _bcs___    move.b    d5,ccr
  1297.     bcc    dc_next
  1298. _br____    ext.w    d4
  1299.     asl.w    #1,d4
  1300.     add.w    d4,d3
  1301.     RETCMD
  1302. _bge___    move.b    d5,ccr
  1303.     bge.s    _br____
  1304.     RETCMD
  1305. _blt___    move.b    d5,ccr
  1306.     blt.s    _br____
  1307.     RETCMD
  1308. _bgt___    move.b    d5,ccr
  1309.     bgt.s    _br____
  1310.     RETCMD
  1311. _ble___    move.b    d5,ccr
  1312.     ble.s    _br____
  1313.     RETCMD
  1314. _bhi___    move.b    d5,ccr
  1315.     bhi.s    _br____
  1316.     RETCMD
  1317. _blos__    move.b    d5,ccr
  1318.     bls.s    _br____
  1319.     RETCMD
  1320. _bpl___ move.b    d5,ccr
  1321.     bpl.s    _br____
  1322.     RETCMD
  1323. _bmi___    move.b    d5,ccr
  1324.     bmi.s    _br____
  1325.     RETCMD
  1326. ;
  1327. ;-------------------------------
  1328. ; JSR Rn,N - Subroutine call
  1329. ;
  1330. jsr_rn    MACRO
  1331.     and.w    #%111111,d4
  1332.     lea    ad_jw(pc),a6
  1333.     move.l    (a6,d4.l*4),a6
  1334.     CALL    a6,a5
  1335.     move.w    \1,d4
  1336.     subq.w    #2,d2        ;shift stack
  1337.     move.w    d2,d7
  1338.     BK_SW    d4,d7
  1339.     move.w    d3,\1
  1340.     move.w    d6,d3
  1341.     RETCMD
  1342.     ENDM
  1343.  
  1344.     FCMD_Rn    jsr_    ;set of eight routines
  1345.  
  1346. ;
  1347. ;-------------------------------
  1348. ; JMP N - Unconditional jump
  1349. ;
  1350. _jmp___    and.w    #%111111,d4
  1351.     lea    ad_jw(pc),a6
  1352.     move.l    (a6,d4.l*4),a6
  1353.     CALL    a6,a5
  1354.     move.w    d6,d3
  1355.     RETCMD
  1356. ;
  1357. ;-----------------------------------
  1358. ; RTS Rn - Return from subroutine
  1359. ;
  1360. rts_rn    MACRO
  1361.     move.w    \1,d3    ;copy register to program counter
  1362.     BK_RRW    d2,d4
  1363.      move.w    d4,\1
  1364.     addq.w    #2,d2    ;stack increment
  1365.     RETCMD
  1366.     ENDM
  1367.  
  1368.     FCMD_Rn    rts_
  1369. ;
  1370. ;-----------------------------------------
  1371. ; MARK N - Stack restore
  1372. ; big thanx to Alexei Saveliev for description
  1373. ;
  1374. _mark__    and.w    #%111111,d4    ;lower six bits
  1375.     asl.w    #1,d4        ;x2
  1376.     add.w    d3,d4        ;add program counter
  1377.     move.w    d4,d2        ;PC+2N->SP
  1378.     move.w    d1,d3        ;R5->PC
  1379.     BK_RRW    d2,d1        ;(SP)->R5
  1380.     addq.w    #2,d2        ;(SP)+
  1381.     RETCMD
  1382. ;
  1383. ;-------------------------------
  1384. ; SOB Rn,N - Cycle
  1385. ;
  1386. sob_rn    MACRO
  1387.     subq.w    #1,\1
  1388.     tst.w    \1
  1389.     beq.l    dc_next        ;register=zero
  1390.     and.w    #%111111,d4    ;extract offset
  1391.     asl.w    #1,d4        ;x2
  1392.     sub.w    d4,d3        ;decrease program counter by offset x 2
  1393.     RETCMD
  1394.     ENDM
  1395.  
  1396.     FCMD_Rn    sob_
  1397. ;
  1398. ;---------------------------------
  1399. ; MOV(B) S,D - Move
  1400. ;
  1401. m_f_rn    MACRO
  1402.     and.w    #@77,d4
  1403.     lea    ad_ww(pc),a6
  1404.     move.l    (a6,d4.l*4),a6
  1405.     move.w    \1,d4
  1406.     move.w    ccr,d7
  1407.     and.w    #%00001100,d7
  1408.     and.w    #%11110001,d5
  1409.     or.w    d7,d5
  1410.     jmp    (a6)
  1411.     ENDM
  1412. mbf_rn    MACRO
  1413.     and.w    #@77,d4
  1414.     lea    ad_wb(pc),a6
  1415.     move.l    (a6,d4.l*4),a6
  1416.     move.w    \1,d4
  1417.     ext.w    d4
  1418.     move.w    ccr,d7
  1419.     and.w    #%00001100,d7
  1420.     and.w    #%11110001,d5
  1421.     or.w    d7,d5
  1422.     jmp    (a6)
  1423.     ENDM
  1424.  
  1425. m_t_rn    MACRO
  1426.     and.w    #@7700,d4
  1427.     asr.l    #6,d4
  1428.     lea    ad_rw(pc),a6
  1429.     move.l    (a6,d4.l*4),a6
  1430.     CALL    a6,a5
  1431.     tst.w    d4
  1432.     move.w    ccr,d7
  1433.     and.w    #%00001100,d7
  1434.     and.w    #%11110001,d5
  1435.     or.w    d7,d5
  1436.     move.w    d4,\1
  1437.     RETCMD
  1438.     ENDM
  1439. mbt_rn    MACRO
  1440.     and.w    #@7700,d4
  1441.     asr.l    #6,d4
  1442.     lea    ad_rb(pc),a6
  1443.     move.l    (a6,d4.l*4),a6
  1444.     CALL    a6,a5
  1445.     ext.w    d4
  1446.     move.w    ccr,d7
  1447.     and.w    #%00001100,d7
  1448.     and.w    #%11110001,d5
  1449.     or.w    d7,d5
  1450.     move.w    d4,\1
  1451.     RETCMD
  1452.     ENDM
  1453.  
  1454.     FCMD_Rn    m_f_
  1455.     FCMD_Rn    mbf_
  1456.     FCMD_Rn    m_t_
  1457.     FCMD_Rn    mbt_
  1458.  
  1459. _mov___    move.l    d4,d6
  1460.     and.w    #%111111000000,d4
  1461.     asr.l    #6,d4
  1462.     lea    ad_rw(pc),a6
  1463.     move.l    (a6,d4.l*4),a6
  1464.     CALL    a6,a5
  1465.     tst.w    d4
  1466.     move.w    ccr,d7
  1467.     and.w    #%00001100,d7
  1468.     and.w    #%11110001,d5
  1469.     or.w    d7,d5
  1470.     and.w    #%111111,d6
  1471.     lea    ad_ww(pc),a6
  1472.     move.l    (a6,d6.l*4),a6
  1473.     jmp    (a6)
  1474.  
  1475. _movb__    move.l    d4,d6
  1476.     and.w    #%111111000000,d4
  1477.     asr.l    #6,d4
  1478.     lea    ad_rb(pc),a6
  1479.     move.l    (a6,d4.l*4),a6
  1480.     CALL    a6,a5
  1481.     ext.w    d4
  1482.     move.w    ccr,d7
  1483.     and.w    #%00001100,d7
  1484.     and.w    #%11110001,d5
  1485.     or.w    d7,d5
  1486.     and.w    #%111111,d6
  1487.     lea    ad_wb(pc),a6
  1488.     move.l    (a6,d6.l*4),a6
  1489.     jmp    (a6)
  1490.  
  1491.  
  1492. ;--------------------------------------------
  1493. ;  ADDRESSING MODES ADDRESS ROUTINES TABLES
  1494. ;--------------------------------------------
  1495. ;
  1496. at_reg    MACRO
  1497.     dc.l    ad\2\1\3
  1498.     ENDM
  1499. at_nreg    MACRO
  1500.     at_reg    0,\1,\2
  1501.     at_reg    1,\1,\2
  1502.     at_reg    2,\1,\2
  1503.     at_reg    3,\1,\2
  1504.     at_reg    4,\1,\2
  1505.     at_reg    5,\1,\2
  1506.     at_reg    6,\1,\2
  1507.     at_reg    7,\1,\2
  1508.     ENDM
  1509. at_nad    MACRO
  1510. ad_\1    at_nreg    0,\1
  1511.     at_nreg    1,\1
  1512.     at_nreg    2,\1
  1513.     at_nreg    3,\1
  1514.     at_nreg    4,\1
  1515.     at_nreg    5,\1
  1516.     at_nreg    6,\1
  1517.     at_nreg    7,\1
  1518.     ENDM
  1519.  
  1520.     cnop    0,4
  1521.     at_nad    rb
  1522.     at_nad    rw
  1523.     at_nad    wb
  1524.     at_nad    ww
  1525.     at_nad    mb
  1526.     at_nad    mw
  1527.     at_nad    jw
  1528.  
  1529. ;------------------------------------------------
  1530. ; MxPS S(D) - Move processor status word
  1531. ;
  1532. _mfps__    move.l    d4,d6
  1533.     move.w    d5,d4
  1534.     move.w    ccr,d7
  1535.     and.w    #%00001100,d7
  1536.     and.w    #%11110001,d5
  1537.     or.w    d7,d5
  1538.     and.w    #%111111,d6
  1539.     lea    ad_wb(pc),a6
  1540.     move.l    (a6,d6.l*4),a6
  1541.     jmp    (a6)
  1542. _mtps__    and.w    #%111111,d4
  1543.     lea    ad_rb(pc),a6
  1544.     move.l    (a6,d4.l*4),a6
  1545.     CALL    a6,a5
  1546.     and.l    #%11101111,d4
  1547.     and.l    #%00010000,d5
  1548.     or.l    d4,d5
  1549.     RETCMD
  1550.  
  1551. ;---------------------------------
  1552. ; CLR(B) D - Clear
  1553. ;
  1554. _clr___    move.l    d4,d6
  1555.     and.w    #%11110000,d5
  1556.     or.w    #%00000100,d5
  1557.     clr.l    d4
  1558.     and.w    #%111111,d6
  1559.     lea    ad_ww(pc),a6
  1560.     move.l    (a6,d6.l*4),a6
  1561.     jmp    (a6)
  1562. _clrb__    move.l    d4,d6
  1563.     and.w    #%11110000,d5
  1564.     or.w    #%00000100,d5
  1565.     clr.l    d4
  1566.     and.w    #%111111,d6
  1567.     lea    ad_wb(pc),a6
  1568.     move.l    (a6,d6.l*4),a6
  1569.     jmp    (a6)
  1570.  
  1571. clr_rn    MACRO
  1572.     clr.w    d4
  1573.     move.w    d4,\1
  1574.     bra.s    _clr_rx
  1575.     ENDM
  1576. clrbrn    MACRO
  1577.     move.w    \1,d4
  1578.     clr.b    d4
  1579.     move.w    d4,\1
  1580.     bra.s    _clr_rx
  1581.     ENDM
  1582.  
  1583.     FCMD_Rn    clr_
  1584.     FCMD_Rn    clrb
  1585.  
  1586.     nop
  1587.  
  1588. _clr_rx    and.w    #%11110000,d5
  1589.     or.w    #%00000100,d5
  1590.     RETCMD
  1591.  
  1592.  
  1593. ;---------------------------------
  1594. ; TST(B) S - Test and set flags
  1595. ;
  1596. tst_rn    MACRO
  1597.     tst.w    \1
  1598.     bra.s    _tst_rx
  1599.     ENDM
  1600. tstbrn    MACRO
  1601.     move.w    \1,d4
  1602.     tst.b    d4
  1603.     bra.s    _tst_rx
  1604.     ENDM
  1605.  
  1606.     FCMD_Rn    tst_
  1607.     FCMD_Rn    tstb
  1608.  
  1609. _tst___    and.w    #%111111,d4
  1610.     lea    ad_rw(pc),a6
  1611.     move.l    (a6,d4.l*4),a6
  1612.     CALL    a6,a5
  1613.     tst.w    d4
  1614. _tst_rx    move.w    ccr,d4
  1615.     and.w    #%00001100,d4
  1616.     and.w    #%11110000,d5
  1617.     or.w    d4,d5
  1618.     RETCMD
  1619. _tstb__    and.w    #%111111,d4
  1620.     lea    ad_rb(pc),a6
  1621.     move.l    (a6,d4.l*4),a6
  1622.     CALL    a6,a5
  1623.     tst.b    d4
  1624.     move.w    ccr,d4
  1625.     and.w    #%00001100,d4
  1626.     and.w    #%11110000,d5
  1627.     or.w    d4,d5
  1628.     RETCMD
  1629.  
  1630. ;-------------------------------------
  1631. ; COM(B) D - Inversion
  1632. ;
  1633. _com___    and.w    #%111111,d4
  1634.     lea    ad_mw(pc),a6
  1635.     move.l    (a6,d4.l*4),a6
  1636.     lea    1$(pc),a5
  1637.     jmp    (a6)
  1638. 1$    not.w    d6
  1639.     move.w    ccr,d4
  1640.     and.w    #%00001100,d4
  1641.     addq.w    #1,d4
  1642.     and.w    #%11110000,d5
  1643.     or.w    d4,d5
  1644.     RET    a6
  1645. _comb__    and.w    #%111111,d4
  1646.     lea    ad_mb(pc),a6
  1647.     move.l    (a6,d4.l*4),a6
  1648.     lea    1$(pc),a5
  1649.     jmp    (a6)
  1650. 1$    not.b    d6
  1651.     move.w    ccr,d4
  1652.     and.w    #%00001100,d4
  1653.     addq.w    #1,d4
  1654.     and.w    #%11110000,d5
  1655.     or.w    d4,d5
  1656.     RET    a6
  1657.  
  1658. ;-------------------------------------
  1659. ; INC(B) D - Increment
  1660. ;
  1661. _inc___    and.w    #%111111,d4
  1662.     lea    ad_mw(pc),a6
  1663.     move.l    (a6,d4.l*4),a6
  1664.     lea    1$(pc),a5
  1665.     jmp    (a6)
  1666. 1$    addq.w    #1,d6
  1667.     move.w    ccr,d4
  1668.     and.w    #%00001110,d4
  1669.     and.w    #%11110001,d5
  1670.     or.w    d4,d5
  1671.     RET    a6
  1672. _incb__    and.w    #%111111,d4
  1673.     lea    ad_mb(pc),a6
  1674.     move.l    (a6,d4.l*4),a6
  1675.     lea    1$(pc),a5
  1676.     jmp    (a6)
  1677. 1$    addq.b    #1,d6
  1678.     move.w    ccr,d4
  1679.     and.w    #%00001110,d4
  1680.     and.w    #%11110001,d5
  1681.     or.w    d4,d5
  1682.     RET    a6
  1683.  
  1684. ;-------------------------------------
  1685. ; DEC(B) D - Decrement
  1686. ;
  1687. _dec___    and.w    #%111111,d4
  1688.     lea    ad_mw(pc),a6
  1689.     move.l    (a6,d4.l*4),a6
  1690.     lea    1$(pc),a5
  1691.     jmp    (a6)
  1692. 1$    subq.w    #1,d6
  1693.     move.w    ccr,d4
  1694.     and.w    #%00001110,d4
  1695.     and.w    #%11110001,d5
  1696.     or.w    d4,d5
  1697.     RET    a6
  1698. _decb__    and.w    #%111111,d4
  1699.     lea    ad_mb(pc),a6
  1700.     move.l    (a6,d4.l*4),a6
  1701.     lea    1$(pc),a5
  1702.     jmp    (a6)
  1703. 1$    subq.b    #1,d6
  1704.     move.w    ccr,d4
  1705.     and.w    #%00001110,d4
  1706.     and.w    #%11110001,d5
  1707.     or.w    d4,d5
  1708.     RET    a6
  1709.  
  1710. ;------------------------------------------
  1711. ; SWAB D - Swap bytes in word
  1712. ;
  1713. _swab__    and.w    #%111111,d4
  1714.     lea    ad_mw(pc),a6
  1715.     move.l    (a6,d4.l*4),a6
  1716.     lea    1$(pc),a5
  1717.     jmp    (a6)
  1718. 1$    rol.w    #8,d6
  1719.     tst.b    d6
  1720.     move.w    ccr,d4
  1721.     and.w    #%00001100,d4
  1722.     and.w    #%11110000,d5
  1723.     or.w    d4,d5
  1724.     RET    a6
  1725. ;------------------------------------------
  1726. ; SXT D - Sign flag extension
  1727. ;
  1728. _sxt___    and.w    #%111111,d4
  1729.     lea    ad_mw(pc),a6
  1730.     move.l    (a6,d4.l*4),a6
  1731.     lea    1$(pc),a5
  1732.     jmp    (a6)
  1733. 1$    move.w    d5,d6
  1734.     rol.w    #4,d6
  1735.     extb.l    d6
  1736.     swap    d6
  1737.     tst.w    d6
  1738.     move.w    ccr,d4
  1739.     and.w    #%00000100,d4
  1740.     and.w    #%11111001,d5
  1741.     or.w    d4,d5
  1742.     RET    a6
  1743.  
  1744. ;-------------------------------------
  1745. ; NEG(B) D - Sign change
  1746. ;
  1747. _neg___    and.w    #%111111,d4
  1748.     lea    ad_mw(pc),a6
  1749.     move.l    (a6,d4.l*4),a6
  1750.     lea    1$(pc),a5
  1751.     jmp    (a6)
  1752. 1$    neg.w    d6
  1753.     move.w    ccr,d4
  1754.     and.w    #%00001111,d4
  1755.     and.w    #%11110000,d5
  1756.     or.w    d4,d5
  1757.     RET    a6
  1758. _negb__    and.w    #%111111,d4
  1759.     lea    ad_mb(pc),a6
  1760.     move.l    (a6,d4.l*4),a6
  1761.     lea    1$(pc),a5
  1762.     jmp    (a6)
  1763. 1$    neg.b    d6
  1764.     move.w    ccr,d4
  1765.     and.w    #%00001111,d4
  1766.     and.w    #%11110000,d5
  1767.     or.w    d4,d5
  1768.     RET    a6
  1769.  
  1770. ;-------------------------------------
  1771. ; ASL(B) D - Arithmetic left shift
  1772. ;
  1773. asl_rn    MACRO
  1774.     move.w    \1,d6
  1775.     asl.w    #1,d6
  1776.     move.w    ccr,d4
  1777.     and.w    #%00001111,d4
  1778.     and.w    #%11110000,d5
  1779.     or.w    d4,d5
  1780.     move.w    d6,\1
  1781.     RETCMD
  1782.     ENDM
  1783. aslbrn    MACRO
  1784.     move.w    \1,d6
  1785.     asl.b    #1,d6
  1786.     move.w    ccr,d4
  1787.     and.w    #%00001111,d4
  1788.     and.w    #%11110000,d5
  1789.     or.w    d4,d5
  1790.     move.w    d6,\1
  1791.     RETCMD
  1792.     ENDM
  1793.  
  1794.     FCMD_Rn    asl_
  1795.     FCMD_Rn    aslb
  1796.  
  1797. _asl___    and.w    #%111111,d4
  1798.     lea    ad_mw(pc),a6
  1799.     move.l    (a6,d4.l*4),a6
  1800.     lea    1$(pc),a5
  1801.     jmp    (a6)
  1802. 1$    asl.w    #1,d6
  1803.     move.w    ccr,d4
  1804.     and.w    #%00001111,d4
  1805.     and.w    #%11110000,d5
  1806.     or.w    d4,d5
  1807.     RET    a6
  1808. _aslb__    and.w    #%111111,d4
  1809.     lea    ad_mb(pc),a6
  1810.     move.l    (a6,d4.l*4),a6
  1811.     lea    1$(pc),a5
  1812.     jmp    (a6)
  1813. 1$    asl.b    #1,d6
  1814.     move.w    ccr,d4
  1815.     and.w    #%00001111,d4
  1816.     and.w    #%11110000,d5
  1817.     or.w    d4,d5
  1818.     RET    a6
  1819.  
  1820. ;-------------------------------------
  1821. ; ASR(B) D - Arithmetic rigth shift
  1822. ;
  1823. asr_rn    MACRO
  1824.     move.w    \1,d6
  1825.     asr.w    #1,d6
  1826.     move.w    ccr,d4
  1827.     move.w    d6,\1
  1828.     and.w    #%00001111,d4
  1829.     and.w    #%11110000,d5
  1830.     or.w    d4,d5
  1831.     RETCMD
  1832.     ENDM
  1833. asrbrn    MACRO
  1834.     move.w    \1,d6
  1835.     asr.b    #1,d6
  1836.     move.w    ccr,d4
  1837.     move.w    d6,\1
  1838.     and.w    #%00001111,d4
  1839.     and.w    #%11110000,d5
  1840.     or.w    d4,d5
  1841.     RETCMD
  1842.     ENDM
  1843.  
  1844.     FCMD_Rn    asr_
  1845.     FCMD_Rn    asrb
  1846.  
  1847. _asr___    and.w    #%111111,d4
  1848.     lea    ad_mw(pc),a6
  1849.     move.l    (a6,d4.l*4),a6
  1850.     lea    1$(pc),a5
  1851.     jmp    (a6)
  1852. 1$    asr.w    #1,d6
  1853.     move.w    ccr,d4
  1854.     and.w    #%00001111,d4
  1855.     and.w    #%11110000,d5
  1856.     or.w    d4,d5
  1857.     RET    a6
  1858. _asrb__    and.w    #%111111,d4
  1859.     lea    ad_mb(pc),a6
  1860.     move.l    (a6,d4.l*4),a6
  1861.     lea    1$(pc),a5
  1862.     jmp    (a6)
  1863. 1$    asr.b    #1,d6
  1864.     move.w    ccr,d4
  1865.     and.w    #%00001111,d4
  1866.     and.w    #%11110000,d5
  1867.     or.w    d4,d5
  1868.     RET    a6
  1869.  
  1870. ;-------------------------------------
  1871. ; ROL(B) D - Cycle left shift
  1872. ;
  1873. rol_rn    MACRO
  1874.     move.w    \1,d6
  1875.     move.l    d5,d4
  1876.     roxr.l    #1,d4
  1877.     roxl.w    #1,d6
  1878.     bmi.s    2$
  1879.     bcc.s    3$
  1880.     or    #2,ccr
  1881.     bra.s    3$
  1882. 2$    bcs.s    3$
  1883.     or    #2,ccr
  1884. 3$    move.w    ccr,d4
  1885.     move.w    d6,\1
  1886.     and.w    #%00001111,d4
  1887.     and.w    #%11110000,d5
  1888.     or.w    d4,d5
  1889.     RETCMD
  1890.     ENDM
  1891. rolbrn    MACRO
  1892.     move.w    \1,d6
  1893.     move.l    d5,d4
  1894.     roxr.l    #1,d4
  1895.     roxl.b    #1,d6
  1896.     bmi.s    2$
  1897.     bcc.s    3$
  1898.     or    #2,ccr
  1899.     bra.s    3$
  1900. 2$    bcs.s    3$
  1901.     or    #2,ccr
  1902. 3$    move.w    ccr,d4
  1903.     move.w    d6,\1
  1904.     and.w    #%00001111,d4
  1905.     and.w    #%11110000,d5
  1906.     or.w    d4,d5
  1907.     RETCMD
  1908.     ENDM
  1909.  
  1910.     FCMD_Rn    rol_
  1911.     FCMD_Rn    rolb
  1912.  
  1913. _rol___    and.w    #%111111,d4
  1914.     lea    ad_mw(pc),a6
  1915.     move.l    (a6,d4.l*4),a6
  1916.     lea    1$(pc),a5
  1917.     jmp    (a6)
  1918. 1$    move.l    d5,d4
  1919.     roxr.l    #1,d4
  1920.     roxl.w    #1,d6
  1921.     bmi.s    2$
  1922.     bcc.s    3$
  1923.     or    #2,ccr
  1924.     bra.s    3$
  1925. 2$    bcs.s    3$
  1926.     or    #2,ccr
  1927. 3$    move.w    ccr,d4
  1928.     and.w    #%00001111,d4
  1929.     and.w    #%11110000,d5
  1930.     or.w    d4,d5
  1931.     RET    a6
  1932. _rolb__    and.w    #%111111,d4
  1933.     lea    ad_mb(pc),a6
  1934.     move.l    (a6,d4.l*4),a6
  1935.     lea    1$(pc),a5
  1936.     jmp    (a6)
  1937. 1$    move.l    d5,d4
  1938.     roxr.l    #1,d4
  1939.     roxl.b    #1,d6
  1940.     bmi.s    2$
  1941.     bcc.s    3$
  1942.     or    #2,ccr
  1943.     bra.s    3$
  1944. 2$    bcs.s    3$
  1945.     or    #2,ccr
  1946. 3$    move.w    ccr,d4
  1947.     and.w    #%00001111,d4
  1948.     and.w    #%11110000,d5
  1949.     or.w    d4,d5
  1950.     RET    a6
  1951.  
  1952. ;-------------------------------------
  1953. ; ROR(B) D - Cycle right shift
  1954. ;
  1955. ror_rn    MACRO
  1956.     move.w    \1,d6
  1957.     move.l    d5,d4
  1958.     roxr.l    #1,d4
  1959.     roxr.w    #1,d6
  1960.     bmi.s    2$
  1961.     bcc.s    3$
  1962.     or    #2,ccr
  1963.     bra.s    3$
  1964. 2$    bcs.s    3$
  1965.     or    #2,ccr
  1966. 3$    move.w    ccr,d4
  1967.     move.w    d6,\1
  1968.     and.w    #%00001111,d4
  1969.     and.w    #%11110000,d5
  1970.     or.w    d4,d5
  1971.     RETCMD
  1972.     ENDM
  1973. rorbrn    MACRO
  1974.     move.w    \1,d6
  1975.     move.l    d5,d4
  1976.     roxr.l    #1,d4
  1977.     roxr.b    #1,d6
  1978.     bmi.s    2$
  1979.     bcc.s    3$
  1980.     or    #2,ccr
  1981.     bra.s    3$
  1982. 2$    bcs.s    3$
  1983.     or    #2,ccr
  1984. 3$    move.w    ccr,d4
  1985.     move.w    d6,\1
  1986.     and.w    #%00001111,d4
  1987.     and.w    #%11110000,d5
  1988.     or.w    d4,d5
  1989.     RETCMD
  1990.     ENDM
  1991.  
  1992.     FCMD_Rn    ror_
  1993.     FCMD_Rn    rorb
  1994.  
  1995. _ror___    and.w    #%111111,d4
  1996.     lea    ad_mw(pc),a6
  1997.     move.l    (a6,d4.l*4),a6
  1998.     lea    1$(pc),a5
  1999.     jmp    (a6)
  2000. 1$    move.l    d5,d4
  2001.     roxr.l    #1,d4
  2002.     roxr.w    #1,d6
  2003.     bmi.s    2$
  2004.     bcc.s    3$
  2005.     or    #2,ccr
  2006.     bra.s    3$
  2007. 2$    bcs.s    3$
  2008.     or    #2,ccr
  2009. 3$    move.w    ccr,d4
  2010.     and.w    #%00001111,d4
  2011.     and.w    #%11110000,d5
  2012.     or.w    d4,d5
  2013.     RET    a6
  2014. _rorb__    and.w    #%111111,d4
  2015.     lea    ad_mb(pc),a6
  2016.     move.l    (a6,d4.l*4),a6
  2017.     lea    1$(pc),a5
  2018.     jmp    (a6)
  2019. 1$    move.l    d5,d4
  2020.     roxr.l    #1,d4
  2021.     roxr.b    #1,d6
  2022.     bmi.s    2$
  2023.     bcc.s    3$
  2024.     or    #2,ccr
  2025.     bra.s    3$
  2026. 2$    bcs.s    3$
  2027.     or    #2,ccr
  2028. 3$    move.w    ccr,d4
  2029.     and.w    #%00001111,d4
  2030.     and.w    #%11110000,d5
  2031.     or.w    d4,d5
  2032.     RET    a6
  2033.  
  2034. ;------------------------------------------
  2035. ; ADC(B) D - Add carry bit
  2036. ;
  2037. _adc___    and.w    #%111111,d4
  2038.     lea    ad_mw(pc),a6
  2039.     move.l    (a6,d4.l*4),a6
  2040.     lea    1$(pc),a5
  2041.     jmp    (a6)
  2042. 1$    move.w    d5,d4
  2043.     and.w    #1,d4
  2044.     add.w    d4,d6
  2045.     move.w    ccr,d4
  2046.     and.w    #%00001111,d4
  2047.     and.w    #%11110000,d5
  2048.     or.w    d4,d5
  2049.     RET    a6
  2050. _adcb__    and.w    #%111111,d4
  2051.     lea    ad_mb(pc),a6
  2052.     move.l    (a6,d4.l*4),a6
  2053.     lea    1$(pc),a5
  2054.     jmp    (a6)
  2055. 1$    move.w    d5,d4
  2056.     and.w    #1,d4
  2057.     add.b    d4,d6
  2058.     move.w    ccr,d4
  2059.     and.w    #%00001111,d4
  2060.     and.w    #%11110000,d5
  2061.     or.w    d4,d5
  2062.     RET    a6
  2063.  
  2064. ;------------------------------------------
  2065. ; SBC(B) D - Subtract carry bit
  2066. ;
  2067. _sbc___    and.w    #%111111,d4
  2068.     lea    ad_mw(pc),a6
  2069.     move.l    (a6,d4.l*4),a6
  2070.     lea    1$(pc),a5
  2071.     jmp    (a6)
  2072. 1$    move.w    d5,d4
  2073.     and.w    #1,d4
  2074.     sub.w    d4,d6
  2075.     move.w    ccr,d4
  2076.     and.w    #%00001111,d4
  2077.     and.w    #%11110000,d5
  2078.     or.w    d4,d5
  2079.     RET    a6
  2080. _sbcb__    and.w    #%111111,d4
  2081.     lea    ad_mb(pc),a6
  2082.     move.l    (a6,d4.l*4),a6
  2083.     lea    1$(pc),a5
  2084.     jmp    (a6)
  2085. 1$    move.w    d5,d4
  2086.     and.w    #1,d4
  2087.     sub.b    d4,d6
  2088.     move.w    ccr,d4
  2089.     and.w    #%00001111,d4
  2090.     and.w    #%11110000,d5
  2091.     or.w    d4,d5
  2092.     RET    a6
  2093.  
  2094. ;---------------------------------
  2095. ; CMP(B) S,D - Compare
  2096. ;
  2097. _cmp___    move.l    d4,d6
  2098.     and.w    #%111111000000,d4
  2099.     asr.l    #6,d4
  2100.     lea    ad_rw(pc),a6
  2101.      move.l    (a6,d4.l*4),a6
  2102.     CALL    a6,a5
  2103.     move.w    d4,d7
  2104.     and.w    #%111111,d6
  2105.     lea    ad_rw(pc),a6
  2106.     move.l    (a6,d6.l*4),a6
  2107.     CALL    a6,a5
  2108.     cmp.w    d4,d7
  2109.     move.w    ccr,d4
  2110.     and.w    #%00001111,d4
  2111.     and.w    #%11110000,d5
  2112.     or.w    d4,d5
  2113.     RETCMD
  2114. _cmpb__    move.l    d4,d6
  2115.     and.w    #%111111000000,d4
  2116.     asr.l    #6,d4
  2117.     lea    ad_rb(pc),a6
  2118.     move.l    (a6,d4.l*4),a6
  2119.     CALL    a6,a5
  2120.     move.w    d4,d7
  2121.     and.w    #%111111,d6
  2122.     lea    ad_rb(pc),a6
  2123.     move.l    (a6,d6.l*4),a6
  2124.     CALL    a6,a5
  2125.     cmp.b    d4,d7
  2126.     move.w    ccr,d4
  2127.     and.w    #%00001111,d4
  2128.     and.w    #%11110000,d5
  2129.     or.w    d4,d5
  2130.     RETCMD
  2131.  
  2132. ;-------------------------------------
  2133. ; BIT(B) S,D - Bit test
  2134. ;
  2135. _bit___    move.l    d4,d6
  2136.     and.w    #%111111000000,d4
  2137.     asr.l    #6,d4
  2138.     lea    ad_rw(pc),a6
  2139.     move.l    (a6,d4.l*4),a6
  2140.     CALL    a6,a5
  2141.     move.w    d4,d7
  2142.     and.w    #%111111,d6
  2143.     lea    ad_rw(pc),a6
  2144.     move.l    (a6,d6.l*4),a6
  2145.     CALL    a6,a5
  2146.     and.w    d7,d4
  2147.     move.w    ccr,d4
  2148.     and.w    #%00001100,d4
  2149.     and.w    #%11110001,d5
  2150.     or.w    d4,d5
  2151.     RETCMD
  2152. _bitb__    move.l    d4,d6
  2153.     and.w    #%111111000000,d4
  2154.     asr.l    #6,d4
  2155.     lea    ad_rb(pc),a6
  2156.     move.l    (a6,d4.l*4),a6
  2157.     CALL    a6,a5
  2158.     move.w    d4,d7
  2159.     and.w    #%111111,d6
  2160.     lea    ad_rb(pc),a6
  2161.     move.l    (a6,d6.l*4),a6
  2162.     CALL    a6,a5
  2163.     and.b    d7,d4
  2164.     move.w    ccr,d4
  2165.     and.w    #%00001100,d4
  2166.     and.w    #%11110001,d5
  2167.     or.w    d4,d5
  2168.     RETCMD
  2169.  
  2170. ;-------------------------------------
  2171. ; BIS(B) S,D - Bit set
  2172. ;
  2173. _bis___    move.l    d4,d6
  2174.     and.w    #%111111000000,d4
  2175.     asr.l    #6,d4
  2176.     lea    ad_rw(pc),a6
  2177.     move.l    (a6,d4.l*4),a6
  2178.     CALL    a6,a5
  2179.     and.w    #%111111,d6
  2180.     lea    ad_mw(pc),a6
  2181.     move.l    (a6,d6.l*4),a6
  2182.     lea    1$(pc),a5
  2183.     jmp    (a6)
  2184. 1$    or.w    d4,d6
  2185.     move.w    ccr,d4
  2186.     and.w    #%00001100,d4
  2187.     and.w    #%11110001,d5
  2188.     or.w    d4,d5
  2189.     RET    a6
  2190. _bisb__    move.l    d4,d6
  2191.     and.w    #%111111000000,d4
  2192.     asr.l    #6,d4
  2193.     lea    ad_rb(pc),a6
  2194.     move.l    (a6,d4.l*4),a6
  2195.     CALL    a6,a5
  2196.     and.w    #%111111,d6
  2197.     lea    ad_mb(pc),a6
  2198.     move.l    (a6,d6.l*4),a6
  2199.     lea    1$(pc),a5
  2200.     jmp    (a6)
  2201. 1$    or.b    d4,d6
  2202.     move.w    ccr,d4
  2203.     and.w    #%00001100,d4
  2204.     and.w    #%11110001,d5
  2205.     or.w    d4,d5
  2206.     RET    a6
  2207.  
  2208. ;-------------------------------------
  2209. ; BIC(B) S,D - Bit clearing
  2210. ;
  2211. _bic___    move.l    d4,d6
  2212.     and.w    #%111111000000,d4
  2213.     asr.l    #6,d4
  2214.     lea    ad_rw(pc),a6
  2215.     move.l    (a6,d4.l*4),a6
  2216.     CALL    a6,a5
  2217.     and.w    #%111111,d6
  2218.     lea    ad_mw(pc),a6
  2219.     move.l    (a6,d6.l*4),a6
  2220.     lea    1$(pc),a5
  2221.     jmp    (a6)
  2222. 1$    not.w    d4
  2223.     and.w    d4,d6
  2224.     move.w    ccr,d4
  2225.     and.w    #%00001100,d4
  2226.     and.w    #%11110001,d5
  2227.     or.w    d4,d5
  2228.     RET    a6
  2229. _bicb__    move.l    d4,d6
  2230.     and.w    #%111111000000,d4
  2231.     asr.l    #6,d4
  2232.     lea    ad_rb(pc),a6
  2233.     move.l    (a6,d4.l*4),a6
  2234.     CALL    a6,a5
  2235.     and.w    #%111111,d6
  2236.     lea    ad_mb(pc),a6
  2237.     move.l    (a6,d6.l*4),a6
  2238.     lea    1$(pc),a5
  2239.     jmp    (a6)
  2240. 1$    not.b    d4
  2241.     and.b    d4,d6
  2242.     move.w    ccr,d4
  2243.     and.w    #%00001100,d4
  2244.     and.w    #%11110001,d5
  2245.     or.w    d4,d5
  2246.     RET    a6
  2247.  
  2248. ;-------------------------------------
  2249. ; ADD S,D - Add
  2250. ;
  2251. _add___    move.l    d4,d6
  2252.     and.w    #%111111000000,d4
  2253.     asr.l    #6,d4
  2254.     lea    ad_rw(pc),a6
  2255.     move.l    (a6,d4.l*4),a6
  2256.     CALL    a6,a5
  2257.     and.w    #%111111,d6
  2258.     lea    ad_mw(pc),a6
  2259.     move.l    (a6,d6.l*4),a6
  2260.     lea    1$(pc),a5
  2261.     jmp    (a6)
  2262. 1$    add.w    d4,d6
  2263.     move.w    ccr,d4
  2264.     and.w    #%00001111,d4
  2265.     and.w    #%11110000,d5
  2266.     or.w    d4,d5
  2267.     RET    a6
  2268.  
  2269. ;-------------------------------------
  2270. ; SUB S,D - Subtract
  2271. ;
  2272. _sub___    move.l    d4,d6
  2273.     and.w    #%111111000000,d4
  2274.     asr.l    #6,d4
  2275.     lea    ad_rw(pc),a6
  2276.     move.l    (a6,d4.l*4),a6
  2277.     CALL    a6,a5
  2278.     and.w    #%111111,d6
  2279.     lea    ad_mw(pc),a6
  2280.     move.l    (a6,d6.l*4),a6
  2281.     lea    1$(pc),a5
  2282.     jmp    (a6)
  2283. 1$    sub.w    d4,d6
  2284.     move.w    ccr,d4
  2285.     and.w    #%00001111,d4
  2286.     and.w    #%11110000,d5
  2287.     or.w    d4,d5
  2288.     RET    a6
  2289.  
  2290. ;----------------------------------------
  2291. ; XOR Rn,D - Exclusive OR
  2292. ;
  2293. xor_rn    MACRO
  2294.     move.l    d4,d6
  2295.     move.w    \1,d4
  2296.     and.w    #%111111,d6
  2297.     lea    ad_mw(pc),a6
  2298.     move.l    (a6,d6.l*4),a6
  2299.     lea    xor_rx(pc),a5
  2300.     jmp    (a6)
  2301.     ENDM
  2302.  
  2303. xor_rx    eor.w    d4,d6
  2304.     move.w    ccr,d4
  2305.     and.w    #%00001100,d4
  2306.     and.w    #%11110001,d5
  2307.     or.w    d4,d5
  2308.     RET    a6
  2309.  
  2310.     FCMD_Rn    xor_
  2311.  
  2312. ;--------------------------
  2313. ;  OPCODES DECODE ROUTINE
  2314. ;--------------------------
  2315.  
  2316. ; registers: R0-R7 as A0,A1,A2,A3,D0,D1,D2,D3
  2317. ; D4 - working data
  2318. ; A4 - emulation memory address
  2319. ; D5 - processor status word (PSW)
  2320.  
  2321. decod    moveq.l    #-1,d0
  2322.     CALLEXEC AllocSignal
  2323.     moveq.l    #1,d1
  2324.     lsl.l    d0,d1
  2325.     move.l    d1,decode_emt36_signal
  2326.     moveq.l    #-1,d0
  2327.     CALLEXEC AllocSignal
  2328.     moveq.l    #1,d1
  2329.     lsl.l    d0,d1
  2330.     move.l    d1,decode_delay_signal
  2331.     moveq.l    #-1,d0
  2332.     CALLEXEC AllocSignal
  2333.     moveq.l    #1,d1
  2334.     lsl.l    d0,d1
  2335.     move.l    d1,decode_sleep_signal
  2336.     move.l    sp,decode_init_stack
  2337.     move.l    #emul_buffer_mid,a4
  2338.     clr.l    d5        ;PS
  2339.     move.l    d5,a0        ;R0
  2340.     move.l    d5,a1        ;R1
  2341.     move.l    d5,a2        ;R2
  2342.     move.l    d5,a3        ;R3
  2343.     clr.l    d0        ;R4
  2344.     clr.l    d1        ;R5
  2345.     move.l    #512,d2        ;SP
  2346. reset    move.l    #$8000,d3    ;PC
  2347.     clr.w    int_flags
  2348.     bsr    reset_hw
  2349.  
  2350. dc_next
  2351.     move.l    intl_flags,d4
  2352.     beq    dc_rtt        ;no flags
  2353.     cmp.w    #$8000,d4    ;only delay flag present?
  2354.     bne    20$        ;no
  2355.     clr.l    d4
  2356.     move.w    d3,d4        ;get program counter
  2357.     addq.w    #2,d3        ;increase program counter
  2358.     BK_RW    d4,d4        ;get opcode
  2359.     move.l    #time_table,a6
  2360.     move.w    (a6,d4.l*2),d6    ;get precalculated opcode timing
  2361.     sub.w    d6,delay_counter
  2362.     bpl.s    10$
  2363.     move.w    #3500,delay_counter    ;reset timing counter
  2364.     movem.l    d0-a6,-(sp)
  2365.     subq.w    #1,slow_counter
  2366.     bpl.s    5$
  2367.     bclr.b    #7,int_flags
  2368.     bra.s    6$
  2369. 5$    clr.l    d0
  2370.     clr.l    d1
  2371.     CALLEXEC SetSignal
  2372.     and.l    decode_delay_signal,d0
  2373.     bne.s    7$
  2374. 6$    move.w    #50,slow_counter
  2375. 7$    move.l    decode_delay_signal,d0
  2376.     CALLEXEC Wait            ;wait for vblank
  2377.     movem.l    (sp)+,d0-a6
  2378. 10$    move.l    #decode_table,a6
  2379.     move.l    (a6,d4.l*4),a6    ;get opcode procedure address
  2380.     jmp    (a6)
  2381.  
  2382. 20$    btst.l    #10,d4        ; trace bit exception
  2383.     beq.s    30$
  2384.     move.w    #@14,d6
  2385.     bsr    int
  2386.     move.w    int_flags,d4
  2387. 30$    btst.l    #8,d4        ; cpu restart
  2388.     bne    reset
  2389.     btst.l    #9,d4        ; STOP key exception
  2390.     beq.s    40$
  2391.     bclr.b    #1,int_flags
  2392.     move.w    #4,d6
  2393.     addq.w    #2,d3        ;increase program counter
  2394.     bra    intc
  2395. 40$    btst.l    #0,d4        ; vector 100 - vblank exception
  2396.     beq.s    50$
  2397.     bclr.b    #0,int_flags+1
  2398.     bclr.b    #0,intm_flags
  2399.     move.w    #@100,d6
  2400.     bra    intc
  2401. 50$    btst.l    #1,d4        ; vector 60 - first keyboard exception
  2402.     beq.s    60$
  2403.     bclr.b    #1,int_flags+1
  2404.     bclr.b    #1,intm_flags
  2405.     move.w    #@60,d6
  2406.     bra    intc
  2407. 60$    btst.l    #2,d4        ; vector 274 - second keyboard exception
  2408.     beq.s    70$
  2409.     bclr.b    #2,int_flags+1
  2410.     bclr.b    #2,intm_flags
  2411.     move.w    #@274,d6
  2412.     bra    intc
  2413. 70$    btst.l    #14,d4        ; terminate emulation process
  2414.     beq.s    80$
  2415.     addq.b    #1,control_break_flag    ;terminate main process
  2416.     move.l    control_proc_ptr,a1
  2417.     move.l    #ALL_BREAKF,d0
  2418.     CALLEXEC Signal            ;send Break to it
  2419.     rts
  2420. 80$    clr.l    d4
  2421. dc_rtt    move.w    d3,d4
  2422.     addq.w    #2,d3
  2423.     BK_RW    d4,d4
  2424.     move.l    #decode_table,a6
  2425.     move.l    (a6,d4.l*4),a6
  2426.     jmp    (a6)
  2427.  
  2428. ; int_flags bits:
  2429. ; 0 - RESET
  2430. ; 1 - STOP
  2431. ; 2 - trace
  2432. ; 6 - terminate process
  2433. ; 7 - delay
  2434. ; int_flags+1 & intm_flags bits:
  2435. ; 0 - vector 100
  2436. ; 1 - vector 60 (keyboard)
  2437. ; 2 - vector 274 (--//--)
  2438.  
  2439. ; registers: R0-R7 as A0,A1,A2,A3,D0,D1,D2,D3
  2440. ; D4 - working data
  2441. ; A4 - emulation memory address
  2442. ; D5 - processor status word (PSW)
  2443. ; label format: ad(addressing_mode_number)(register_number)(data_size)
  2444.  
  2445.  
  2446. ;--------------------------------
  2447. ;  BYTE SOURCE ADDRESSING MODES
  2448. ;--------------------------------
  2449. ad0xrb    MACRO            ; move byte from R
  2450.     move.w    \1,d4
  2451.     RET    a5
  2452.     ENDM
  2453. ad1xrb    MACRO            ; move byte from (R)
  2454.     BK_RB    \1,d4
  2455.     RET    a5
  2456.     ENDM
  2457. ad2xrb    MACRO            ; move byte from (R)+
  2458.     BK_RB    \1,d4
  2459.     IFC    '\1','p6'
  2460.     addq.w    #2,\1
  2461.     ELSE
  2462.     IFC    '\1','p7'
  2463.     addq.w    #2,\1
  2464.     ELSE
  2465.     addq.w    #1,\1
  2466.     ENDC
  2467.     ENDC
  2468.     RET    a5
  2469.     ENDM
  2470. ad3xrb    MACRO            ; move byte from @(R)+
  2471.     BK_RRW    \1,d4
  2472.     addq.w    #2,\1
  2473.     BK_RB    d4,d4
  2474.     RET    a5
  2475.     ENDM
  2476. ad4xrb    MACRO            ; move byte from -(R)
  2477.     IFC    '\1','p6'
  2478.     subq.w    #2,\1
  2479.     ELSE
  2480.     IFC    '\1','p7'
  2481.     subq.w    #2,\1
  2482.     ELSE
  2483.     subq.w    #1,\1
  2484.     ENDC
  2485.     ENDC
  2486.     BK_RB    \1,d4
  2487.     RET    a5
  2488.     ENDM
  2489. ad5xrb    MACRO            ; move byte from @-(R)
  2490.     subq.w    #2,\1
  2491.     BK_RRW    \1,d4
  2492.     BK_RB    d4,d4
  2493.     RET    a5
  2494.     ENDM
  2495. ad6xrb    MACRO            ; move byte from N(R)
  2496.     BK_RRW    d3,d4
  2497.     addq.w    #2,d3
  2498.     add.w    \1,d4
  2499.     BK_RB    d4,d4
  2500.     RET    a5
  2501.     ENDM
  2502. ad7xrb    MACRO            ; move byte from @N(R)
  2503.     BK_RRW    d3,d4
  2504.     addq.w    #2,d3
  2505.     add.w    \1,d4
  2506.     BK_RW    d4,d4
  2507.     BK_RB    d4,d4
  2508.     RET    a5
  2509.     ENDM
  2510.  
  2511. ;--------------------------------
  2512. ;  WORD SOURCE ADDRESSING MODES
  2513. ;--------------------------------
  2514. ad0xrw    MACRO            ; move word from R
  2515.     move.w    \1,d4
  2516.     RET    a5
  2517.     ENDM
  2518. ad1xrw    MACRO            ; move word from (R)
  2519.     BK_RRW    \1,d4
  2520.     RET    a5
  2521.     ENDM
  2522. ad2xrw    MACRO            ; move word from (R)+
  2523.     BK_RRW    \1,d4
  2524.     addq.w    #2,\1
  2525.     RET    a5
  2526.     ENDM
  2527. ad3xrw    MACRO            ; move word from @(R)+
  2528.     BK_RRW    \1,d4
  2529.     addq.w    #2,\1
  2530.     BK_RW    d4,d4
  2531.     RET    a5
  2532.     ENDM
  2533. ad4xrw    MACRO            ; move word from -(R)
  2534.     subq.w    #2,\1
  2535.     BK_RRW    \1,d4
  2536.     RET    a5
  2537.     ENDM
  2538. ad5xrw    MACRO            ; move word from @-(R)
  2539.     subq.w    #2,\1
  2540.     BK_RRW    \1,d4
  2541.     BK_RW    d4,d4
  2542.     RET    a5
  2543.     ENDM
  2544. ad6xrw    MACRO            ; move word from N(R)
  2545.     BK_RRW    d3,d4
  2546.     addq.w    #2,d3
  2547.     add.w    \1,d4
  2548.     BK_RW    d4,d4
  2549.     RET    a5
  2550.     ENDM
  2551. ad7xrw    MACRO            ; move word from @N(R)
  2552.     BK_RRW    d3,d4
  2553.     addq.w    #2,d3
  2554.     add.w    \1,d4
  2555.     BK_RW    d4,d4
  2556.     BK_RW    d4,d4
  2557.     RET    a5
  2558.     ENDM
  2559.  
  2560. ;-------------------------------------
  2561. ;  BYTE DESTINATION ADDRESSING MODES
  2562. ;-------------------------------------
  2563. ad0xwb    MACRO            ; move byte to R
  2564.     move.w    d4,\1
  2565.     RETCMD
  2566.     ENDM
  2567. ad1xwb    MACRO            ; move byte to (R)
  2568.     BK_SB    d4,\1
  2569.     RETCMD
  2570.     ENDM
  2571. ad2xwb    MACRO            ; move byte to (R)+
  2572.     BK_SB    d4,\1
  2573.     IFC    '\1','p6'
  2574.     addq.w    #2,\1
  2575.     ELSE
  2576.     IFC    '\1','p7'
  2577.     addq.w    #2,\1
  2578.     ELSE
  2579.     addq.w    #1,\1
  2580.     ENDC
  2581.     ENDC
  2582.     RETCMD
  2583.     ENDM
  2584. ad3xwb    MACRO            ; move byte to @(R)+
  2585.     BK_RRW    \1,d6
  2586.     addq.w    #2,\1
  2587.     BK_SB    d4,d6
  2588.     RETCMD
  2589.     ENDM
  2590. ad4xwb    MACRO            ; move byte to -(R)
  2591.     IFC    '\1','p6'
  2592.     subq.w    #2,\1
  2593.     ELSE
  2594.     IFC    '\1','p7'
  2595.     subq.w    #2,\1
  2596.     ELSE
  2597.     subq.w    #1,\1
  2598.     ENDC
  2599.     ENDC
  2600.     BK_SB    d4,\1
  2601.     RETCMD
  2602.     ENDM
  2603. ad5xwb    MACRO            ; move byte to @-(R)
  2604.     subq.w    #2,\1
  2605.     BK_RRW    \1,d6
  2606.     BK_SB    d4,d6
  2607.     RETCMD
  2608.     ENDM
  2609. ad6xwb    MACRO            ; move byte to N(R)
  2610.     BK_RRW    d3,d6
  2611.     addq.w    #2,d3
  2612.     add.w    \1,d6
  2613.     BK_SB    d4,d6
  2614.     RETCMD
  2615.     ENDM
  2616. ad7xwb    MACRO            ; move byte to @N(R)
  2617.     BK_RRW    d3,d6
  2618.     addq.w    #2,d3
  2619.     add.w    \1,d6
  2620.     BK_RW    d6,d6
  2621.     BK_SB    d4,d6
  2622.     RETCMD
  2623.     ENDM
  2624.  
  2625. ;-------------------------------------
  2626. ;  WORD DESTINATION ADDRESSING MODES
  2627. ;-------------------------------------
  2628. ad0xww    MACRO            ; move word to R
  2629.     move.w    d4,\1
  2630.     RETCMD
  2631.     ENDM
  2632. ad1xww    MACRO            ; move word to (R)
  2633.     move.w    \1,d6
  2634.     BK_SW    d4,d6
  2635.     RETCMD
  2636.     ENDM
  2637. ad2xww    MACRO            ; move word to (R)+
  2638.     move.w    \1,d6
  2639.     BK_SW    d4,d6
  2640.     addq.w    #2,\1
  2641.     RETCMD
  2642.     ENDM
  2643. ad3xww    MACRO            ; move word to @(R)+
  2644.     BK_RRW    \1,d6
  2645.     addq.w    #2,\1
  2646.     BK_SW    d4,d6
  2647.     RETCMD
  2648.     ENDM
  2649. ad4xww    MACRO            ; move word to -(R)
  2650.     subq.w    #2,\1
  2651.     move.w    \1,d6
  2652.     BK_SW    d4,d6
  2653.     RETCMD
  2654.     ENDM
  2655. ad5xww    MACRO            ; move word to @-(R)
  2656.     subq.w    #2,\1
  2657.     BK_RRW    \1,d6
  2658.     BK_SW    d4,d6
  2659.     RETCMD
  2660.     ENDM
  2661. ad6xww    MACRO            ; move word to N(R)
  2662.     BK_RRW    d3,d6
  2663.     addq.w    #2,d3
  2664.     add.w    \1,d6
  2665.     BK_SW    d4,d6
  2666.     RETCMD
  2667.     ENDM
  2668. ad7xww    MACRO            ; move word to @N(R)
  2669.     BK_RRW    d3,d6
  2670.     addq.w    #2,d3
  2671.     add.w    \1,d6
  2672.     BK_RW    d6,d6
  2673.     BK_SW    d4,d6
  2674.     RETCMD
  2675.     ENDM
  2676.  
  2677. ;-----------------------------------------
  2678. ;  WORD SOURCE ADDRESSING MODES FOR JUMP
  2679. ;-----------------------------------------
  2680. ad0xjw    MACRO            ; move word from R
  2681.     move.w    d3,d6        ; = NOP
  2682.     RET    a5
  2683.     ENDM
  2684. ad1xjw    MACRO            ; move word from (R)
  2685.     move.w    \1,d6
  2686.     RET    a5
  2687.     ENDM
  2688. ad2xjw    MACRO            ; move word from (R)+
  2689.     move.w    \1,d6
  2690.     addq.w    #2,\1
  2691.     RET    a5
  2692.     ENDM
  2693. ad3xjw    MACRO            ; move word from @(R)+
  2694.     BK_RRW    \1,d6
  2695.     addq.w    #2,\1
  2696.     RET    a5
  2697.     ENDM
  2698. ad4xjw    MACRO            ; move word from -(R)
  2699.     subq.w    #2,\1
  2700.     move.w    \1,d6
  2701.     RET    a5
  2702.     ENDM
  2703. ad5xjw    MACRO            ; move word from @-(R)
  2704.     subq.w    #2,\1
  2705.     BK_RRW    \1,d6
  2706.     RET    a5
  2707.     ENDM
  2708. ad6xjw    MACRO            ; move word from N(R)
  2709.     BK_RRW    d3,d6
  2710.     addq.w    #2,d3
  2711.     add.w    \1,d6
  2712.     RET    a5
  2713.     ENDM
  2714. ad7xjw    MACRO            ; move word from @N(R)
  2715.     BK_RRW    d3,d4
  2716.     addq.w    #2,d3
  2717.     add.w    \1,d4
  2718.     BK_RW    d4,d6
  2719.     RET    a5
  2720.     ENDM
  2721.  
  2722. ;--------------------------------------
  2723. ;  BYTE MODIFICATION ADDRESSING MODES
  2724. ;--------------------------------------
  2725. ad0xmb    MACRO            ; byte modification in R
  2726.     move.w    \1,d6
  2727.     CALL    a5,a6
  2728.     move.w    d6,\1
  2729.     RETCMD
  2730.     ENDM
  2731. ad1xmb    MACRO            ; byte modification in (R)
  2732.     BK_RB    \1,d6
  2733.     CALL    a5,a6
  2734.     BK_SB    d6,\1
  2735.     RETCMD
  2736.     ENDM
  2737. ad2xmb    MACRO            ; byte modification in (R)+
  2738.     BK_RB    \1,d6
  2739.     CALL    a5,a6
  2740.     BK_SB    d6,\1
  2741.     IFC    '\1','p6'
  2742.     addq.w    #2,\1
  2743.     ELSE
  2744.     IFC    '\1','p7'
  2745.     addq.w    #2,\1
  2746.     ELSE
  2747.     addq.w    #1,\1
  2748.     ENDC
  2749.     ENDC
  2750.     RETCMD
  2751.     ENDM
  2752. ad3xmb    MACRO            ; byte modification in @(R)+
  2753.     BK_RRW    \1,d7
  2754.     addq.w    #2,\1
  2755.     BK_RB    d7,d6
  2756.     CALL    a5,a6
  2757.     BK_SB    d6,d7
  2758.     RETCMD
  2759.     ENDM
  2760. ad4xmb    MACRO            ; byte modification in -(R)
  2761.     IFC    '\1','p6'
  2762.     subq.w    #2,\1
  2763.     ELSE
  2764.     IFC    '\1','p7'
  2765.     subq.w    #2,\1
  2766.     ELSE
  2767.     subq.w    #1,\1
  2768.     ENDC
  2769.     ENDC
  2770.     BK_RB    \1,d6
  2771.     CALL    a5,a6
  2772.     BK_SB    d6,\1
  2773.     RETCMD
  2774.     ENDM
  2775. ad5xmb    MACRO            ; byte modification in @-(R)
  2776.     subq.w    #2,\1
  2777.     BK_RRW    \1,d7
  2778.     BK_RB    d7,d6
  2779.     CALL    a5,a6
  2780.     BK_SB    d6,d7
  2781.     RETCMD
  2782.     ENDM
  2783. ad6xmb    MACRO            ; byte modification in N(R)
  2784.     BK_RRW    d3,d7
  2785.     addq.w    #2,d3
  2786.     add.w    \1,d7
  2787.     BK_RB    d7,d6
  2788.     CALL    a5,a6
  2789.     BK_SB    d6,d7
  2790.     RETCMD
  2791.     ENDM
  2792. ad7xmb    MACRO            ; byte modification in @N(R)
  2793.     BK_RRW    d3,d7
  2794.     addq.w    #2,d3
  2795.     add.w    \1,d7
  2796.     BK_RW    d7,d7
  2797.     BK_RB    d7,d6
  2798.     CALL    a5,a6
  2799.     BK_SB    d6,d7
  2800.     RETCMD
  2801.     ENDM
  2802.  
  2803. ;--------------------------------------
  2804. ;  WORD MODIFICATION ADDRESSING MODES
  2805. ;--------------------------------------
  2806. ad0xmw    MACRO            ; word modification in R
  2807.     move.w    \1,d6
  2808.     CALL    a5,a6
  2809.     move.w    d6,\1
  2810.     RETCMD
  2811.     ENDM
  2812. ad1xmw    MACRO            ; word modification in (R)
  2813.     move.w    \1,d7
  2814.     BK_RW    d7,d6
  2815.     CALL    a5,a6
  2816.     BK_NSW    d6,d7
  2817.     RETCMD
  2818.     ENDM
  2819. ad2xmw    MACRO            ; word modification in (R)+
  2820.     move.w    \1,d7
  2821.     addq.w    #2,\1
  2822.     BK_RW    d7,d6
  2823.     CALL    a5,a6
  2824.     BK_NSW    d6,d7
  2825.     RETCMD
  2826.     ENDM
  2827. ad3xmw    MACRO            ; word modification in @(R)+
  2828.     BK_RRW    \1,d7
  2829.     addq.w    #2,\1
  2830.     BK_RW    d7,d6
  2831.     CALL    a5,a6
  2832.     BK_NSW    d6,d7
  2833.     RETCMD
  2834.     ENDM
  2835. ad4xmw    MACRO            ; word modification in -(R)
  2836.     subq.w    #2,\1
  2837.     move.w    \1,d7
  2838.     BK_RW    d7,d6
  2839.     CALL    a5,a6
  2840.     BK_NSW    d6,d7
  2841.     RETCMD
  2842.     ENDM
  2843. ad5xmw    MACRO            ; word modification in @-(R)
  2844.     subq.w    #2,\1
  2845.     BK_RRW    \1,d7
  2846.     BK_RW    d7,d6
  2847.     CALL    a5,a6
  2848.     BK_NSW    d6,d7
  2849.     RETCMD
  2850.     ENDM
  2851. ad6xmw    MACRO            ; word modification in N(R)
  2852.     BK_RRW    d3,d7
  2853.     addq.w    #2,d3
  2854.     add.w    \1,d7
  2855.     BK_RW    d7,d6
  2856.     CALL    a5,a6
  2857.     BK_NSW    d6,d7
  2858.     RETCMD
  2859.     ENDM
  2860. ad7xmw    MACRO            ; word modification in @N(R)
  2861.     BK_RRW    d3,d7
  2862.     addq.w    #2,d3
  2863.     add.w    \1,d7
  2864.     BK_RW    d7,d7
  2865.     BK_RW    d7,d6
  2866.     CALL    a5,a6
  2867.     BK_NSW    d6,d7
  2868.     RETCMD
  2869.     ENDM
  2870.  
  2871. ;-----------------------------
  2872. ;  ADDRESSING MODES ROUTINES
  2873. ;-----------------------------
  2874. ;
  2875. ad_reg    MACRO
  2876. ad\2\1\3
  2877.     ad\2x\3    p\1
  2878.     ENDM
  2879. ad_nreg    MACRO
  2880.     ad_reg    0,\1,\2
  2881.     ad_reg    1,\1,\2
  2882.     ad_reg    2,\1,\2
  2883.     ad_reg    3,\1,\2
  2884.     ad_reg    4,\1,\2
  2885.     ad_reg    5,\1,\2
  2886.     ad_reg    6,\1,\2
  2887.     ad_reg    7,\1,\2
  2888.     ENDM
  2889. ad_nad    MACRO
  2890.     ad_nreg    0,\1
  2891.     ad_nreg    1,\1
  2892.     ad_nreg    2,\1
  2893.     ad_nreg    3,\1
  2894.     ad_nreg    4,\1
  2895.     ad_nreg    5,\1
  2896.     ad_nreg    6,\1
  2897.     ad_nreg    7,\1
  2898.     ENDM
  2899.  
  2900.     ad_nad    rb
  2901.     ad_nad    rw
  2902.     ad_nad    wb
  2903.     ad_nad    ww
  2904.     ad_nad    mb
  2905.     ad_nad    mw
  2906.     ad_nad    jw
  2907.  
  2908.  
  2909.     section    tables,data
  2910.  
  2911.     cnop    0,4
  2912. ;-------------------------------------
  2913. ;  HARDWARE REGISTERS TABLE FOR READ
  2914. ;-------------------------------------
  2915.     dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  2916.     dc.l    rp177660
  2917.     dc.l    rp177662
  2918.     dc.l    rp177664
  2919.     dc.l    0,0,0,0,0
  2920.     dc.l    rp177700
  2921.     dc.l    rp177702
  2922.     dc.l    rp177704
  2923.     dc.l    rp177706
  2924.     dc.l    rp177710
  2925.     dc.l    rp177712
  2926.     dc.l    rp177714
  2927.     dc.l    rp177716
  2928.     dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  2929. prt_vm1
  2930.  
  2931. ;--------------------------------------
  2932. ;  HARDWARE REGISTERS TABLE FOR WRITE
  2933. ;--------------------------------------
  2934. ;
  2935.     dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  2936.     dc.l    wp177660
  2937.     dc.l    0
  2938.     dc.l    wp177664
  2939.     dc.l    0,0,0,0,0
  2940.     dc.l    wp177700
  2941.     dc.l    wp177702
  2942.     dc.l    wp177704
  2943.     dc.l    wp177706
  2944.     dc.l    wp177710
  2945.     dc.l    wp177712
  2946.     dc.l    wp177714
  2947.     dc.l    wp177716
  2948.     dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  2949. pwt_vm1
  2950.  
  2951. ;-----------------------------------
  2952. ;  PROCESSOR OPCODES ADDRESS TABLE
  2953. ;-----------------------------------
  2954. ;
  2955. ct_vm1
  2956.     dCMD    _halt__,1    ;000000
  2957.     dCMD    _wait__,1    ;000001
  2958.     dCMD    _rti___,1    ;000002
  2959.     dCMD    _bpt___,1    ;000003
  2960.     dCMD    _iot___,1    ;000004
  2961.     dCMD    _reset_,1    ;000005
  2962.     dCMD    _rtt___,1    ;000006
  2963.     dCMD    _rsrv__,57
  2964.     dCMD    _jmp___,64    ;0001xx
  2965.     CMD_Rm    _rts_        ;000200
  2966.     dCMD    _rsrv__,24
  2967.     dCMD    _cl____,16    ;000240
  2968.     dCMD    _se____,16    ;000260
  2969.     dCMD    _swab__,64    ;0003xx
  2970.     dCMD    _br____,256    ;000400
  2971.     dCMD    _bne___,256    ;001000
  2972.     dCMD    _beq___,256    ;001400
  2973.     dCMD    _bge___,256    ;002000
  2974.     dCMD    _blt___,256    ;002400
  2975.     dCMD    _bgt___,256    ;003000
  2976.     dCMD    _ble___,256    ;003400
  2977.     CMD_Rn    _jsr_        ;004xxx
  2978.     CMD_Rx    _clr_        ;0050xx
  2979.     dCMD    _com___,64    ;0051xx
  2980.     dCMD    _inc___,64    ;0052xx
  2981.     dCMD    _dec___,64    ;0053xx
  2982.     dCMD    _neg___,64    ;0054xx
  2983.     dCMD    _adc___,64    ;0055xx
  2984.     dCMD    _sbc___,64    ;0056xx
  2985.     CMD_Rx    _tst_        ;0057xx
  2986.     CMD_Rx    _ror_        ;0060xx
  2987.     CMD_Rx    _rol_        ;0061xx
  2988.     CMD_Rx    _asr_        ;0062xx
  2989.     CMD_Rx    _asl_        ;0063xx
  2990.     dCMD    _mark__,64    ;0064xx
  2991.     dCMD    _rsrv__,128    ;006500
  2992.     dCMD    _sxt___,64    ;0067xx
  2993.     dCMD    _rsrv__,512    ;007000
  2994. ; MOV
  2995. tm__rx    MACRO
  2996.     CMD_Rm    _m_t_
  2997.     dCMD    _m_f_\1,56
  2998.     ENDM
  2999.  
  3000.     tm__rx    r0
  3001.     tm__rx    r1
  3002.     tm__rx    r2
  3003.     tm__rx    r3
  3004.     tm__rx    r4
  3005.     tm__rx    r5
  3006.     tm__rx    r6
  3007.     tm__rx    r7
  3008.  
  3009.     REPT    56
  3010.     CMD_Rm    _m_t_
  3011.     dCMD    _mov___,56
  3012.     ENDR
  3013. ;
  3014.     dCMD    _cmp___,4096    ;02xxxx
  3015.     dCMD    _bit___,4096    ;03xxxx
  3016.     dCMD    _bic___,4096    ;04xxxx
  3017.     dCMD    _bis___,4096    ;05xxxx
  3018.     dCMD    _add___,4096    ;06xxxx
  3019.     dCMD    _rsrv__,2048    ;070000
  3020.     CMD_Rn    _xor_        ;074xxx
  3021.     dCMD    _rsrv__,1024    ;075xxx
  3022.     CMD_Rn    _sob_        ;077xxx
  3023.     dCMD    _bpl___,256    ;100000
  3024.     dCMD    _bmi___,256    ;100400
  3025.     dCMD    _bhi___,256    ;101000
  3026.     dCMD    _blos__,256    ;101400
  3027.     dCMD    _bvc___,256    ;102000
  3028.     dCMD    _bvs___,256    ;102400
  3029.     dCMD    _bcc___,256    ;103000
  3030.     dCMD    _bcs___,256    ;103400
  3031.     dCMD    _emt___,30    ;104000
  3032.     dCMD    _emt_36,1    ;104036
  3033.     dCMD    _emt___,225    ;104000
  3034.     dCMD    _trap__,256    ;104400
  3035.     CMD_Rx    _clrb        ;1050xx
  3036.     dCMD    _comb__,64    ;1051xx
  3037.     dCMD    _incb__,64    ;1052xx
  3038.     dCMD    _decb__,64    ;1053xx
  3039.     dCMD    _negb__,64    ;1054xx
  3040.     dCMD    _adcb__,64    ;1055xx
  3041.     dCMD    _sbcb__,64    ;1056xx
  3042.     CMD_Rx    _tstb        ;1057xx
  3043.     CMD_Rx    _rorb        ;1060xx
  3044.     CMD_Rx    _rolb        ;1061xx
  3045.     CMD_Rx    _asrb        ;1062xx
  3046.     CMD_Rx    _aslb        ;1063xx
  3047.     dCMD    _mtps__,64    ;1064xx
  3048.     dCMD    _rsrv__,128    ;1065xx
  3049.     dCMD    _mfps__,64    ;1067xx
  3050.     dCMD    _rsrv__,512    ;107xxx
  3051. ; MOVB
  3052. tmb_rx    MACRO
  3053.     CMD_Rm    _mbt_
  3054.     dCMD    _mbf_\1,56
  3055.     ENDM
  3056.  
  3057.     tmb_rx    r0
  3058.     tmb_rx    r1
  3059.     tmb_rx    r2
  3060.     tmb_rx    r3
  3061.     tmb_rx    r4
  3062.     tmb_rx    r5
  3063.     tmb_rx    r6
  3064.     tmb_rx    r7
  3065.  
  3066.     REPT    56
  3067.     CMD_Rm    _mbt_
  3068.     dCMD    _movb__,56
  3069.     ENDR
  3070.  
  3071.     dCMD    _cmpb__,4096    ;12xxxx
  3072.     dCMD    _bitb__,4096    ;13xxxx
  3073.     dCMD    _bicb__,4096    ;14xxxx
  3074.     dCMD    _bisb__,4096    ;15xxxx
  3075.     dCMD    _sub___,4096    ;16xxxx
  3076.     dCMD    _rsrv__,4096    ;17xxxx
  3077.     dc.l    0
  3078.  
  3079.         cnop    0,4
  3080.  
  3081. monotag        dc.l    SA_DisplayID,$8000
  3082. mono_x        dc.l    SA_Left,64
  3083. mono_y        dc.l    SA_Top,0
  3084.         dc.l    SA_Quiet,1
  3085.         dc.l    SA_AutoScroll,1
  3086.         dc.l    SA_Width,512
  3087.         dc.l    SA_Height,256
  3088.         dc.l    SA_Depth,1
  3089.         dc.l    SA_Title,w_s_title
  3090.         dc.l    SA_Colors,mono_colorspec
  3091.         dc.l    TAG_END,0
  3092.  
  3093. colortag    dc.l    SA_DisplayID,0
  3094. color_x        dc.l    SA_Left,32
  3095. color_y        dc.l    SA_Top,0
  3096.         dc.l    SA_Quiet,1
  3097.         dc.l    SA_AutoScroll,1
  3098.         dc.l    SA_Width,256
  3099.         dc.l    SA_Height,256
  3100.         dc.l    SA_Depth,2
  3101.         dc.l    SA_Title,w_s_title
  3102.         dc.l    SA_Colors,color_colorspec
  3103.         dc.l    TAG_END,0
  3104.  
  3105. decode_proc_tags
  3106.         dc.l    NP_Entry,decod
  3107.         dc.l    NP_Priority,-1
  3108.         dc.l    NP_Name,decode_proc_name
  3109.         dc.l    TAG_END,0
  3110.  
  3111. refresh_proc_tags
  3112.         dc.l    NP_Entry,refresh_proc
  3113.         dc.l    NP_Priority,1
  3114.         dc.l    NP_Name,refresh_proc_name
  3115.         dc.l    TAG_END,0
  3116.  
  3117. mono_colorspec    dc.w    0,0,0,0
  3118.         dc.w    1,12,12,12
  3119.         dc.w    17,0,0,0
  3120.         dc.w    18,0,0,0
  3121.         dc.w    19,0,0,0
  3122.         dc.w    -1
  3123. color_colorspec    dc.w    0,0,0,0
  3124.         dc.w    1,0,0,15
  3125.         dc.w    2,0,15,0
  3126.         dc.w    3,15,0,0
  3127.         dc.w    17,0,0,0
  3128.         dc.w    18,0,0,0
  3129.         dc.w    19,0,0,0
  3130.         dc.w    -1
  3131. monotab        dc.w    $0000,$0DDD
  3132. colortab    dc.w    $0000,$000F,$00F0,$0F00
  3133.  
  3134. w_bk_screen
  3135.     dc.w    0,0                ;x&y coordinates
  3136. wwidth    dc.w    256,256                ;width and height
  3137.     dc.b    0,0                ;default pens
  3138.     dc.l    VANILLAKEY!RAWKEY        ;IDCMP flags
  3139.     dc.l    ACTIVATE!SIMPLE_REFRESH!BORDERLESS!BACKDROP!RMBTRAP
  3140.     dc.l    0                ;no gadgets
  3141.     dc.l    0                ;no checkmarks
  3142.     dc.l    w_s_title
  3143. sbs_ptr    dc.l    0        ;emulator screen
  3144.     dc.l    0        ;no bitmap
  3145.     dc.w    0,0,0,0        ;minimum, irrelevant as no sizing gadget
  3146.     dc.w    CUSTOMSCREEN
  3147.  
  3148. c_bk_screen
  3149.     dc.w    0,0
  3150.     dc.w    1,1
  3151.     dc.b    0,0
  3152.     dc.l    CLOSEWINDOW!VANILLAKEY!RAWKEY
  3153.     dc.l    WINDOWCLOSE!ACTIVATE!SIMPLE_REFRESH!BORDERLESS!RMBTRAP
  3154.     dc.l    0
  3155.     dc.l    0
  3156.     dc.l    w_s_title
  3157. sbs_cop    dc.l    0
  3158.     dc.l    0
  3159.     dc.w    0,0,0,0
  3160.     dc.w    CUSTOMSCREEN
  3161.  
  3162.  
  3163. keytab1    dc.b    $50,128+01
  3164.     dc.b    $51,000+03
  3165.     dc.b    $52,128+11
  3166.     dc.b    $53,000+22
  3167.     dc.b    $54,000+23
  3168.     dc.b    $55,128+02
  3169.     dc.b    $56,128+04
  3170.     dc.b    $57,128+00
  3171.     dc.b    $58,000+12
  3172.     dc.b    $64,000+14    ;RUS
  3173.     dc.b    $65,000+15    ;LAT
  3174.     dc.b    $4C,000+26    ;up
  3175.     dc.b    $4D,000+27    ;down
  3176.     dc.b    $4F,000+08    ;left
  3177.     dc.b    $4E,000+25    ;right
  3178.     dc.b    0
  3179.  
  3180. keytab2    dc.b    009,128+09
  3181.     dc.b    008,000+24
  3182.     dc.b    127,000+19
  3183.     dc.b    013,000+10
  3184.     dc.b    0
  3185.  
  3186.  
  3187.     dc.b    $87,$B6,$D4,$AF,$83,$AA,$BF,$94
  3188.     dc.b    $82,$D4,$AD,$BE,$81,$76,$B5,$95
  3189.     dc.b    $A5,$3C,$9A,$5E,$D4,$A1,$9E,$A2
  3190.     dc.b    $2A,$B4,$9F,$87,$80,$8D,$3E,$9C
  3191.     dc.b    $FE,$E0,$E1,$F6,$E4,$E5,$F4,$E3
  3192.     dc.b    $F5,$E8,$E9,$EA,$EB,$EC,$ED,$EE
  3193.     dc.b    $EF,$FF,$F0,$F1,$F2,$F3,$E6,$E2
  3194.     dc.b    $FC,$FB,$E7,$F8,$FD,$F9,$F7,$FA
  3195.     dc.b    $DE,$C0,$C1,$D6,$C4,$C5,$D4,$C3
  3196.     dc.b    $D5,$C8,$C9,$CA,$CB,$CC,$CD,$CE
  3197.     dc.b    $CF,$DF,$D0,$D1,$D2,$D3,$C6,$C2
  3198.     dc.b    $DC,$DB,$C7,$D8,$DD,$D9,$D7,$DA
  3199.  
  3200. koi8_to_1251_table
  3201.  
  3202.             cnop    0,4
  3203.  
  3204. _SysBase        dc.l    0
  3205. _IntuitionBase        dc.l    0        ;intuition
  3206. _GfxBase        dc.l    0        ;graphics
  3207. _DOSBase        dc.l    0        ;dos
  3208. WB_return_message    dc.l    0
  3209. emt36_block_ptr        dc.l    0
  3210. wbs_ptr            dc.l    0
  3211. cbs_ptr            dc.l    0
  3212. old_wbs_ptr        dc.l    0
  3213. old_cbs_ptr        dc.l    0
  3214. old_sbs_ptr        dc.l    0
  3215. return_code        dc.l    0
  3216. ROM_file_handle        dc.l    0
  3217. emt36_handle        dc.l    0
  3218. emt36_ptr        dc.l    0
  3219. decode_init_stack    dc.l    0
  3220. decode_emt36_signal    dc.l    0
  3221. decode_delay_signal    dc.l    0
  3222. decode_sleep_signal    dc.l    0
  3223. decode_proc_ptr        dc.l    0
  3224. refresh_proc_ptr    dc.l    0
  3225. control_proc_ptr    dc.l    0
  3226. control_proc_signal    dc.l    0
  3227. intl_flags        dc.w    0
  3228. int_flags        dc.w    0
  3229. delay_counter        dc.w    2000
  3230. slow_counter        dc.w    50
  3231. emt36_adr        dc.w    0
  3232. emt36_len        dc.w    0
  3233. p177660            dc.w    0
  3234. p177662            dc.w    0
  3235. p177664            dc.w    @1330
  3236. c177664            dc.w    @1330
  3237. p177714            dc.w    0
  3238. p177716            dc.w    @100340
  3239. intm_flags        dc.b    0
  3240. refresh_counter        dc.b    0
  3241. control_proc_signal_bit    dc.b    0
  3242. bk_color_mode_flag    dc.b    -1
  3243. bk_color_mode        dc.b    -1
  3244. control_break_flag    dc.b    0
  3245. refresh_break_flag    dc.b    0
  3246. rus_flag        dc.b    0
  3247. ROM_load_enable        dc.b    0
  3248. version            dc.b    '$VER: '
  3249. w_s_title        dc.b    'bkemul 1.6 beta',0
  3250. ROM_file_name        dc.b    'PROGDIR:bk_rom',0
  3251. decode_proc_name    dc.b    '1801BM1 emulation',0
  3252. refresh_proc_name    dc.b    'Screen refresh',0
  3253. name_full        dc.b    'PROGDIR:bkfiles/'
  3254. name_buffer        ds.b    18
  3255.             ds.b    6
  3256. comment_buffer        dc.b    0
  3257. intname            INTNAME
  3258. grafname        GRAFNAME
  3259. dosname            DOSNAME
  3260.  
  3261.             even
  3262.  
  3263. ;    section    databuf,bss
  3264. ;data_buffer
  3265. ;    ds.l    $10000
  3266.  
  3267.     section    decode,bss
  3268. decode_table
  3269.     ds.l    $10000
  3270.  
  3271.     section    time,bss
  3272. time_table
  3273.     ds.w    $10000
  3274.  
  3275.     section    conv,bss
  3276. conv_table
  3277.     ds.l    $10000
  3278.  
  3279.     section    delta,bss
  3280. delta_buffer
  3281.     ds.b    $4000
  3282.  
  3283.     section    embuf,bss
  3284. emul_buffer_begin
  3285.     ds.b    $8000
  3286. emul_buffer_mid
  3287.     ds.b    $8000
  3288. emul_buffer_end
  3289.  
  3290.     section    fibbuf,bss
  3291. fib_buffer
  3292.     ds.b    fib_SIZEOF
  3293.  
  3294.     end
  3295.